有四个线程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方法或指定睡眠时间来唤醒
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(): 设置一个线程的优先级。