在B类中设置一个标志,用来告诉B线程是否需要暂停,B发现标志为true则暂停3秒。
关键代码大概如下,直接在回复文本框写的,难免有错。
public A extends Thread{
public void run(){
}}
public B extends Thread{
private boolean pause;
public B(){
super();
this.pause = false;
} public synchronized void pause(){
this.pause = true;
} public void run(){
while(true){
synchronized(this){
if(pause){
sleep(3000L);
}
}
// do something
}
}}
关键代码大概如下,直接在回复文本框写的,难免有错。
public A extends Thread{
public void run(){
}}
public B extends Thread{
private boolean pause;
public B(){
super();
this.pause = false;
} public synchronized void pause(){
this.pause = true;
} public void run(){
while(true){
synchronized(this){
if(pause){
sleep(3000L);
}
}
// do something
}
}}
sleep(3000L);
pause=false;
}
还有一点需要说明的是,暂停3秒期间如果再次设置暂停的话,设置暂停的线程会被暂时挂起,直到3秒结束之后,在下个循环中再次进入下个3秒。如果你不希望在暂停期间,设置暂停的线程被挂起的话,你可以实现一个消息队列。
sleep(3000L);
pause=false;
}
还有一点需要说明的是,暂停3秒期间如果再次设置暂停的话,设置暂停的线程会被暂时挂起,直到3秒结束之后,在下个循环中再次进入下个3秒。如果你不希望在暂停期间,设置暂停的线程被挂起的话,你可以实现一个消息队列。
private boolean pause; 可以写成 private volatile boolean pause;然后在 public synchronized void pause()方法中就不需要synchronized 同步了吧!
import java.util.concurrent.TimeUnit;public class Demo8 {
public static void main(String[] args) {
B b = new B();
A a = new A(b); b.start();
a.start();
}
}class A extends Thread { private B b; public A(B b) {
this.b = b;
} @Override
public void run() {
try {
int i = 0;
while (true) {
i++;
System.out.println("A is runing");
TimeUnit.MILLISECONDS.sleep(500);
if (i > 5) {
System.out.println("A 开始沉睡3秒");
b.join(3000);
System.out.println("A 醒来正常执行");
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}}class B extends Thread { @Override
public void run() {
try {
while (true) {
System.out.println("B is runing");
TimeUnit.MILLISECONDS.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}}