1.线程的建立 需继承Thread,并重写run方法java
public class MyThread extends Thread { @Override public void run() { for (int i=0;i<100;i++){ if(i%2==0){ System.out.println(i); } } } }
2.线程的使用ide
实例化,并调用Start()方法测试
获取当前线程名称的方法:this
Thread.currentThread().getName()
public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); System.out.println("hello"); }
3. 问题1 ,不能直接调用run()方法启动线程线程
直接调用run方法不会启用线程,会在调用run方法的线程内执行code
4.问题2 ,线程实例不能再次start 会报 IllegalThreadStateException异常对象
能够再实例化一个线程对象。继承
5.练习生命周期
/* * 练习:建立两个分线程,1 遍历100内偶数 2 遍历100内奇数 * */ public class ThreadDemo { public static void main(String[] args) { //1.建立对象方式 /* MyThread1 myThread1 = new MyThread1(); MyThread2 myThread2 = new MyThread2(); myThread1.start(); myThread2.start();*/ //2.建立Thread类的匿名子类方式 new Thread(){ @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2==0){ System.out.println(Thread.currentThread().getName()+" : "+ i); } } } }.start(); new Thread(){ @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2!=0){ System.out.println(Thread.currentThread().getName()+" : " +i); } } } }.start(); } } class MyThread1 extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2==0){ System.out.println(Thread.currentThread().getName()+" : "+ i); } } } } class MyThread2 extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2!=0){ System.out.println(Thread.currentThread().getName()+" : " +i); } } } }
6. Thread 的经常使用方法队列
- void start() :启动线程,并执行对象的run()方法
- run(); 线程在被调度时执行的操做
- String getName() 返回线程的名称
- void setName(String name) : 设置该线程的名称
- static Thread currentThread(): 返回当前线程。在Thead子类中就是this ,一般用于主线程和Runable实现类
- static void yied():线程让步
- 暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程
- 若队列中没有同优先级的线程,忽略此方法
- join() 当某个程序执行流中调用其余线程的join()方法时,调用线程将被阻塞,直到join()方法加入的join线程执行完毕为止
- 低优先级的线程也能够得到执行
- static void sleep(long millis): 指定时间:毫秒
- 令当前活动线程在指定时间段内放弃对CPU控制,使其余线程有机会被执行,时间到后重排队。
- 抛出InterruptedException异常
- stop() 强制线程生命期结束,不推荐使用
- boolean isAlive(): 返回boolean 判断线程是否还活着
package com.zhanghl.service; /* * 测试Thread类中的经常使用方法: * 1.start() :启动线程,并执行对象的run()方法 * 2.run(): 一般须要重写Thread类中的此方法,将建立的线程要执行的操做声明再此方法中 * 3.currentThread(): 返回当前代码执行的线程,静态方法 * 4.getName():获取当前线程的方法 * 5.setName(): 设置当前线程的方法 * 6.yield() 线程让步 * 7.join() 在线程A中调用线程B的join(),此时线程A进入阻塞状态, * 直到线程B彻底执行完之后,线程A才会结束阻塞状态 * 8.stop() 强制线程生命周期中止。不推荐使用,已过期 * 9.sleep(long millitime) 让当前线程睡眠指定的millitime毫秒,在指定的millitime毫秒时间内,当前线程时阻塞装 * 10. isAlive() 判断当前线程是否存活 * */ public class ThreadMethodTest { public static void main(String[] args) { /*构造器方式命名*/ HelloThread h1 = new HelloThread("线程1"); //h1.setName("线程一"); h1.start(); /*给主线程命名*/ Thread.currentThread().setName("主线程"); for (int i = 0; i < 100; i++) { if(i%2==0){ System.out.println(Thread.currentThread().getName()+" : "+ i); } /*当i==20时 让子线程 h1 先执行 ,执行完毕再回到主线程*/ if (i==20){ try { h1.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println("h1.isAlive()"+h1.isAlive()); } } class HelloThread extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2!=0){ try { //睡眠1秒 sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" : "+ i); } /*yield释放执行权*/ /*if(i%10==0){ this.yield(); }*/ } } public HelloThread(){} /*利用Thread 类中 使用名称实例化的方法*/ public HelloThread(String name){ super(name); } }