让线程顺序执行有哪些方法?
1 个回答
重新审视自己,什么使你快乐,什么就是眼下最珍贵。东方朔### 主线程Join 就是调用threadA.start()方法让线程A先执行,然后主线程调用threadA.join()方法,然后主线程进入TIME_WAITING状态,直到threadA执行结束后,主线程才能继续往下执行,执行线程B的任务。(join方法的底层实现其实是调用了threadA的wait()方法,当线程A执行完毕后,会自动调用notifyAll()方法唤醒所有线程。) 示例代码如下: ```java Thread threadA = new Thread(new Runnable() { @Override public void run() { //执行threadA的任务 } }); Thread threadB= new Thread(new Runnable() { @Override public void run() { //执行threadB的任务 } }); //执行线程A任务 threadA.start(); //主线程进行等待 threadA.join(); //执行线程B的任务 threadB.start(); ``` ### 子线程Join 就是让线程B的任务在执行时,调用threadA.join()方法,这样就只有等线程A的任务执行完成后,才会执行线程B。 ```java Thread threadA = new Thread(new Runnable() { @Override public void run() { //执行threadA的任务 } }); Thread threadB= new Thread(new Runnable() { @Override public void run() { //子线程进行等待,知道threadA任务执行完毕 threadA.join(); //执行threadB的任务 } }); //执行线程A任务 threadA.start(); //执行线程B的任务 threadB.start(); ``` ### 单线程池法 就是使用Executors.newSingleThreadExecutor()这个线程池,这个线程池的特点就是只有一个执行线程,可以保证任务按顺序执行。 ```java ExecutorService pool = Executors.newSingleThreadExecutor(); //提交任务A executorService.submit(taskA); //提交任务B executorService.submit(taskB); ``` ### 等待通知法(wait和notify) 就是在线程B中调用Object.waiting()方法进行等待,线程A执行完毕后调用Object.notify()方法进行唤醒。(这种方法有两个缺点,一个是Object.waiting()和notify()方法必须在同步代码块中调用,第二个是如果线程A执行过快,先调用了object.notify()方法,就会导致线程B后面一直得不到唤醒。) ```java final Object object = new Object(); Thread threadA = new Thread(new Runnable() { @Override public void run() { //执行threadA的任务 synchronized(object) { object.notify(); } } }); Thread threadB= new Thread(new Runnable() { @Override public void run() { synchronized(object) { //子线程进行等待,知道threadA任务执行完毕 object.wait(); //执行threadB的任务 } } }); ``` ### 等待通知法(await和singal) 具体实现就是Reentrantlock可以创建出一个Condition实例queue,可以认为是一个等待队列,线程B调用queue.await()就会进行等待,直到线程A执行完毕调用queue.signal()来唤醒线程B。 ```java final ReentrantLock lock = new ReentrantLock(); final Condition queue1 = lock.newCondition(); final Object object = new Object(); final Thread threadA = new Thread(new Runnable() { @Override public void run() { //执行threadA的任务 lock.lock(); try { //唤醒线程B的任务 queue1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("执行了任务A2"); lock.unlock(); } }); final Thread threadB= new Thread(new Runnable() { @Override public void run() { lock.lock(); //子线程进行等待,知道threadA任务执行完毕 try { queue1.await(); System.out.println("执行了任务B2"); } catch (InterruptedException e) { e.printStackTrace(); } //执行threadB的任务 lock.unlock(); } }); threadA.start(); threadB.start(); ``` 参考链接:[http://cnblogs.com/wenjunwei/p/10573289.html](http://cnblogs.com/wenjunwei/p/10573289.html)发布于 2022-02-10 07:22 •IP属地 湖北举报评论收藏
公众号进入网站体验更佳

