.png)
Java开发
具备真实项目经验的工程师方案
参与大数据项目研发
查看详情>>
一个线程等待另一个线程完成的方法
class TestJoin extends Thread { // 有参数构造器,设置名字 public TestJoin(String name) { super(name); } // 重写run方法,定义线程执行体 public void run() { for (int i = 0; i < 10; i++) { System.out.println(getName() + " " + i); // 创建启动线程,每个线程执行在这里循环打印10次 } } public static void main(String[] args) throws Exception { // 启动子线程 new TestJoin("新线程").start(); for (int i = 0; i < 10; i++) { if (5 == i) { TestJoin jn = new TestJoin("被join的线程"); jn.start(); jn.setPriority(MAX_PRIORITY); // 设置优先级 jn.join(); // jn.sleep(5000); 线程睡眠,5秒后才执行最后打印主线程 } System.out.println(Thread.currentThread().getName() + "" + i); // 打印主线程 } } } |
新线程和主线程并发执行,为5时启动被join的线程,该线程不和主线程并发执行,主线程等待该线程执行完毕才可以执行。
让线程暂停一段时间,进入阻塞状态。
yield让当前正在执行的线程暂停,不会阻塞线程,只是让线程转入就绪状态。让系统的线程调度器重新调度一次,完全可能yield之后又被调度器重新调度(主要看优先级)。
1、sleep阻塞态,给其他线程机会,不看优先级,yield就绪态。
2、sleep之后,过了阻塞时间才转入就绪态。
3、sleep声明抛出InterruptException异常,yield没有声明任何异常。
4、sleep可移植性好。
高优先级先执行,线程与创建他的父线程优先级相同,main方法普通优先级。
Thread提供setPriority(int newPriority)和getPriority(),setPriority范围1-10;
静态变量:MAX_PRIORITY :10 MIN_PRIORITY: 1 NORM_PRIORITY:5
所有前台线程都死亡,后台线程自动死亡。如JVM垃圾回收线程。
Thread.setDaemon(true)设置为后台线程,必须在start之前调用。
public class TestDemon extends Thread { public void run() { for (int i = 0; i < 10000; i++) { System.err.println(getName() + " " + i); } } public static void main(String[] args) { TestDemon daemon = new TestDemon(); daemon.setDaemon(true);// 设置为后台线程 daemon.start(); for (int i = 0; i < 10; i++) { System.err.println(Thread.currentThread().getName() + " " + i); } // 执行到此,main线程结束,后台线程随之结束 } } |
后台线程无法运行到9999。
Object类提供了wait()、notify()、notifyAll()三个方法,这三个方法不属于Thread类。三个方法必须由同步监视器对象调用;
1、用synchronized修饰的同步方法,默认实例this就是,可在同步方法直接调用。
2、 用synchronized修饰的同步代码块,是synchronized后括号中的对象。
Wait():让当前线程等待,之前其他线程调用该同步监视器的notify或notifyall唤醒。
Notify():唤醒在同步监视器上等待的线程。
Notifyall():唤醒在同步监视器上等待的所有线程。
版权声明:本文来源于网络,由知了堂搜集整理,仅供大家学习