转载:https://blog.csdn.net/eene894777/article/details/74942485
方法一:通过共享对象锁加上可见变量来实现。
public classMyService { private volatile int orderNum = 1; public synchronized voidmethodA() { 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 voidmethodB() { 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 voidmethodC() { try{ while (orderNum != 3) { wait(); } for (int i = 0; i < 2; i++) { System.out.println("CCCCC"); } orderNum = 1; notifyAll(); } catch(InterruptedException e) { e.printStackTrace(); } } }
importservice.MyService; public class ThreadAA extendsThread { privateMyService dbtools; publicThreadAA(MyService dbtools) { super(); this.dbtools =dbtools; } @Override public voidrun() { dbtools.methodA(); } }
importservice.MyService; public class ThreadBB extendsThread { privateMyService dbtools; publicThreadBB(MyService dbtools) { super(); this.dbtools =dbtools; } @Override public voidrun() { dbtools.methodB(); } }
importservice.MyService; public class ThreadCC extendsThread { privateMyService dbtools; publicThreadCC(MyService dbtools) { this.dbtools =dbtools; } @Override public voidrun() { dbtools.methodC(); } }
importextthread.ThreadCC; importservice.MyService; importextthread.ThreadAA; importextthread.ThreadBB; public classRun { public static voidmain(String[] args) { MyService myService = newMyService(); for (int i = 0; i < 2; i++) { ThreadBB output = newThreadBB(myService); output.start(); ThreadAA input = newThreadAA(myService); input.start(); ThreadCC threadCC = newThreadCC(myService); threadCC.start(); } } }
方法二:通过主线程Join()
class T11 extendsThread { public voidrun() { System.out.println("in T1"); } } class T22 extendsThread { public voidrun() { System.out.println("in T2"); } } class T33 extendsThread { public voidrun() { System.out.println("in T3"); } } public classTest2 { public static void main(String[] args) throwsInterruptedException { T11 t1 = newT11(); T22 t2 = newT22(); T33 t3 = newT33(); t1.start(); t1.join(); t2.start(); t2.join(); t3.start(); } }
方法三:通过线程执行时Join()
class T1 extendsThread { public voidrun(){ Random random = newRandom(); try{ Thread.sleep(random.nextInt(1000)); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println("in T1"); } } class T2 extendsThread{ privateThread thread; publicT2(Thread thread) { this.thread =thread; } public voidrun(){ try{ thread.join(); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println("in T2"); } } class T3 extendsThread{ privateThread thread; publicT3(Thread thread) { this.thread =thread; } public voidrun(){ try{ thread.join(); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println("in T3"); } } public classTest { public static void main(String[] args) throwsInterruptedException { T1 t1 = newT1(); T2 t2 = newT2(t1); T3 t3 = newT3(t2); t2.start(); t1.start(); t3.start(); } }
方法四,使用线程池newSingleThreadExecutor()
packagecom.zyh.controller.test; importjava.util.concurrent.ExecutorService; importjava.util.concurrent.Executors; /*** student threads * * @author1101399 * @CreateDate 2018-7-30 下午2:09:01 */ public classThreadTestOne { public static void main(String[] args) throwsInterruptedException { final ThreadTest A1 = new ThreadTest("A1"); final ThreadTest A2 = new ThreadTest("A2"); final ThreadTest A3 = new ThreadTest("A3"); // A1.start(); TODO 屏蔽 // A2.start(); TODO 屏蔽 A1.join(); A2.join(); System.out.println("方法一实现多线程"); if (!A1.isAlive()) {//A1 线程不存在的时候控制台打印一条信息 System.out.println("A1执行完毕?!"); } final Thread B1 = new Thread(new RunnableTest("B1")); // B1.start(); TODO 屏蔽 final Thread B2 = new Thread(new RunnableTest("B2")); // B2.start(); TODO 屏蔽 B1.join(); B2.join(); System.out.println("方法二实现多线程"); /*** 直接实现线程的开辟 FIXME */ final Thread C1 = new Thread(newRunnable() { @Override public voidrun() { try{ A1.join(); A2.join(); B1.join(); B2.join(); } catch(InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < 15; i++) { System.out.println("··············"); } } }); // C1.start(); TODO 屏蔽 C1.join(); System.out.println("方法三实现多线程"); System.out.println("线程池的应用"); //线程池的学习&应用 TODO 依次执行 ExecutorService executor =Executors.newSingleThreadExecutor(); executor.submit(A1); executor.submit(A2); executor.submit(A3); executor.execute(B1);//这种样子的线程类就是不执行 executor.execute(A1); executor.submit(B1);// 这三种线程的实现方式之前不能 XXX start()启动线程 executor.submit(B2);// 这三种线程的实现方式之前不能 XXX start()启动线程 executor.submit(C1);// 这三种线程的实现方式之前不能 XXX start()启动线程 executor.shutdown();//停止传入任务 //executor.shutdownNow();//停止线程池-对线程池说STOP //会导致线程池中第一个线程的sleep出现sleep interrupted异常 //该函数的核心是:它向该线程发起interrupt()请求,而sleep()方法遇到有interrupt()请求时,会抛出InterruptedException(),并继续往下执行 //运行到这条语句直接停止线程池-检测线程停止后执行的join()函数毫无意义,不能生效 } /*** 继承Thread来实现多线程编程 FIXME */ public static class ThreadTest extendsThread { publicString nameOne; publicStringBuffer nameTwo; publicStringBuilder nameThree; private longtime; //构造函数 publicThreadTest(String name) { this.nameOne =name; } //构造函数 public ThreadTest(String name, longtime) { this.nameOne =name; this.time =time; } @Override public voidrun() { for (int i = 0; i < 5; i++) { System.out.println(this.nameOne + " Thread运行第 " + i + " 次!"); try{ if (this.time != 0) { sleep(this.time +i); System.out.println(this.nameOne + "-time-" + (time +i)); } else{ //sleep((int) Math.random() * 1000); sleep(50); System.out .println(this.nameOne + "-random-" + (int) (Math.random() * 1000)); } } catch(InterruptedException e) { e.printStackTrace(); } } } } /*** 实现接口Runnable来实现多线程编程 FIXME */ public static class RunnableTest implementsRunnable { publicString nameOne; publicStringBuffer nameTwo; publicStringBuilder nameThree; private longtime; publicRunnableTest(String name) { this.nameOne =name; } public RunnableTest(String name, longtime) { this.nameOne =name; this.time =time; } @Override public voidrun() { for (int i = 0; i < 5; i++) { System.out.println(this.nameOne + " Runnable运行第 " + i + " 次!"); try{ if (this.time != 0) { Thread.sleep(this.time +i); System.out.println(this.nameOne + "-time-" + (time +i)); } else{ Thread.sleep((int) Math.random() * 1000); System.out .println(this.nameOne + "-random-" + (int) (Math.random() * 1000)); } } catch(InterruptedException e) { e.printStackTrace(); } } } } }
final Thread B1 = new Thread(new RunnableTest("B1")); B1.start();//TODO 屏蔽 final Thread B2 = new Thread(new RunnableTest("B2")); B2.start();//TODO 屏蔽 final Thread C1 = new Thread(newRunnable() { @Override public voidrun() { try{ A1.join(); A2.join(); B1.join(); B2.join(); } catch(InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < 2; i++) { System.out.println("··············"); } } }); C1.start();//TODO 屏蔽 executor.submit(B1);//这三种线程的实现方式之前不能 XXX start()启动线程 executor.submit(B2);//这三种线程的实现方式之前不能 XXX start()启动线程 executor.submit(C1);//这三种线程的实现方式之前不能 XXX start()启动线程