Java 指定线程执行顺序(三种方式)
2018-01-10 16:29
337 查看
方法一:通过共享对象锁加上可见变量来实现
/** * 指定线程执行顺序:通过synchronized共享对象锁加上volatile可见变量来实现 */ public class ThreadOrder { private volatile int orderNum = 1; public synchronized void methodA() { try { while (orderNum != 1) { wait(); } for (int i = 0; i < 2; i++) { System.out.println("AAAAA"); } orderNum = 2; notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void methodB() { try { while (orderNum != 2) { wait(); } for (int i = 0; i < 2; i++) { System.out.println("BBBBB"); } orderNum = 3; notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void methodC() { try { while (orderNum != 3) { wait(); } for (int i = 0; i < 2; i++) { System.out.println("CCCCC"); } orderNum = 1; notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } }
测试类:
package com.example.concurrent; import org.junit.Test; public class ThreadOrderTest { /** * 指定线程执行顺序:通过共享对象锁加上可见变量来实现 * * @throws Exception */ @Test public void test() throws Exception { ThreadOrder threadOrder = new ThreadOrder(); Thread thread1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub threadOrder.methodA(); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub threadOrder.methodB(); } }); Thread thread3 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub threadOrder.methodC(); } }); thread1.start(); thread2.start(); thread3.start(); } }
执行结果:
AAA AAA BBB BBB CCC CCC
可以看到线程的启动按顺序执行了。共享对象锁,可以保证每个方法只能同时有一个线程进入,配合wait和notifyAll方法,可以启动或者唤醒线程。
方法二:通过主线程Join()
join()方法的意思是等待线程执行完程序后死亡。测试类:
package com.example.concurrent; import org.junit.Test; public class ThreadOrderTest { /** * 通过主线程join() * * @throws Exception */ @Test public void test2() throws Exception { Thread thread1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("AAA"); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("BBB"); } }); Thread thread3 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("CCC"); } }); thread1.start(); thread1.join(); thread2.start(); thread2.join(); thread3.start(); thread3.join(); } }
执行结果:
AAA BBB CCC
方法三:通过线程执行时Join()
class T1 extends Thread { public void run(){ Random random = new Random(); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("in T1"); } } class T2 extends Thread{ private Thread thread; public T2(Thread thread) { this.thread = thread; } public void run(){ try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("in T2"); } } class T3 extends Thread{ private Thread thread; public T3(Thread thread) { this.thread = thread; } public void run(){ try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("in T3"); } } public class Test { public static void main(String[] args) throws InterruptedException { T1 t1 = new T1(); T2 t2 = new T2(t1); T3 t3 = new T3(t2); t2.start(); t1.start(); t3.start(); } }
执行结果:
in T1 in T2 in T3
相关文章推荐
- Java 指定线程执行顺序(三种方式)
- Java 指定线程执行顺序(三种方式)
- Java-按指定顺序执行线程
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- Java 多线程 (PART XIX) 使用Condition实现线程的顺序执行
- Java中线程顺序执行
- JavaWeb项目启动时,自动执行代码的三种方式(包含不占用tomcat启动时长的方式)
- 用java传统线程方式实现多线程轮询执行问题
- Java 启动线程三种方式
- Java线程循环顺序执行
- Java控制3个线程顺序执行2次
- 三种Java创建线程的方式(Callable,FutureTask)
- Java--线程的先后执行顺序控制
- java线程的三种创建方式对比
- 信号量(随意指定线程执行顺序)
- java 保证线程顺序的几种方式
- java中控制线程间执行顺序的方法
- Java中线程的三种实现方式
- java创建线程的三种方式以及比较
- java创建线程的三种方式及其对比