Java线程如何按照你想要的顺序执行
2016-12-28 15:21
459 查看
有四个线程ABCD,我需要他们按照abcd的顺序依次打印5次,即ABCDABCDABCDABCDABCD。如何实现呢?
首先你需要了解如何控制线程执行顺序。那就需要知道唤醒以及等待的顺序,所以每个进程需要添加2个琐,一个对象琐prev,也就是前一个程序执行的琐,一个是本身的琐self琐。一个程序想要执行,必须是前一个对象琐释放(程序中用的是wait),自身的self琐被唤醒。
比如A如果想要执行。就必须是D的对象琐被释放,A的自身琐被唤醒。`
简单介绍一下sleep方法以及Wait方法
*Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等*
Sleep方法睡眠时:依然占有琐。其他线程无法访问这个对象,等等sleep时间结束后,改线程可能现在并不会被立即执行(会执行,排队等待执行),可能其他线程正在运行。
Wait方法睡眠时:释放对象琐,其他线程可以访问这个对象。(wiat()必须放在synchronized 中,否则会扔出”java.lang.IllegalMonitorStateException“异常。)wait方法使用notify方法或指定睡眠时间来唤醒
线程类的常用方法:
sleep(): 线程睡眠单位好眠。
isAlive(): 判断线程是否存活。
join(): 等待线程终止。
activeCount(): 程序中活跃的线程数。
enumerate(): 枚举程序中的线程。
currentThread(): 得到当前线程。
isDaemon(): 判断一个线程是否为守护线程。
setDaemon(): 设置一个线程为守护线程。
setName(): 为线程设置一个名称。
wait(): 强迫一个线程等待。
notify(): 通知一个线程继续运行。
setPriority(): 设置一个线程的优先级。
首先你需要了解如何控制线程执行顺序。那就需要知道唤醒以及等待的顺序,所以每个进程需要添加2个琐,一个对象琐prev,也就是前一个程序执行的琐,一个是本身的琐self琐。一个程序想要执行,必须是前一个对象琐释放(程序中用的是wait),自身的self琐被唤醒。
比如A如果想要执行。就必须是D的对象琐被释放,A的自身琐被唤醒。`
简单介绍一下sleep方法以及Wait方法
*Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等*
Sleep方法睡眠时:依然占有琐。其他线程无法访问这个对象,等等sleep时间结束后,改线程可能现在并不会被立即执行(会执行,排队等待执行),可能其他线程正在运行。
Wait方法睡眠时:释放对象琐,其他线程可以访问这个对象。(wiat()必须放在synchronized 中,否则会扔出”java.lang.IllegalMonitorStateException“异常。)wait方法使用notify方法或指定睡眠时间来唤醒
public class MyThreadTest implements Runnable { private String name; private Object prev; private Object self; private MyThreadTest(String name, Object prev, Object self) { this.name = name; this.prev = prev; this.self = self; } public void run(){ int count=5; while(count>0){ synchronized (prev) { synchronized (self) { System.out.println(name); count--; self.notify(); } try { prev.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public static void main(String[] args) throws Exception{ Object a = new Object(); Object b = new Object(); Object c = new Object(); Object d = new Object(); MyThreadTest th1 =new MyThreadTest("A", d, a); MyThreadTest th2 =new MyThreadTest("B", a, b); MyThreadTest th3 =new MyThreadTest("C", b, c); MyThreadTest th4 =new MyThreadTest("D", c, d); new Thread(th1).start(); Thread.sleep(1);//必须要加确保程序按照顺序执行 new Thread(th2).start(); Thread.sleep(1); //必须要加确保程序按照顺序执行 new Thread(th3).start(); Thread.sleep(1); //必须要加确保程序按照顺序执行 new Thread(th4).start(); Thread.sleep(1); //必须要加确保程序按照顺序执行 } } `
线程类的常用方法:
sleep(): 线程睡眠单位好眠。
isAlive(): 判断线程是否存活。
join(): 等待线程终止。
activeCount(): 程序中活跃的线程数。
enumerate(): 枚举程序中的线程。
currentThread(): 得到当前线程。
isDaemon(): 判断一个线程是否为守护线程。
setDaemon(): 设置一个线程为守护线程。
setName(): 为线程设置一个名称。
wait(): 强迫一个线程等待。
notify(): 通知一个线程继续运行。
setPriority(): 设置一个线程的优先级。
相关文章推荐
- [转]Java 如何同步顺序执行多个线程
- JAVA如何让多个线程顺序执行?
- Java 如何同步顺序执行多个线程
- Java如何等待子线程执行结束
- Java如何等待子线程执行结束
- 有三个线程T1 T2 T3,如何保证他们按顺序执行
- 如何控制线程执行的先后顺序
- 破除java神话之五:等待的线程是按照优先级顺序被唤醒的
- java 中线程执行顺序控制
- java的join和yield方法处理线程顺序执行
- Java_如何等待子线程执行结束
- 有三个线程T1 T2 T3,如何保证他们按顺序执行-转载
- Java中多个线程按顺序执行
- java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)
- Java中使用ReentrantLock控制线程执行顺序
- Java中线程顺序执行
- Java如何等待子线程执行结束
- Java如何等待子线程执行结束
- java如何把一篇英文按照空格分割并按照字母顺序排序
- Java线程执行顺序小结及线程池终止判定