在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
         }
    }}

解决方案 »

  1.   

    忘记了,应该在sleep之后,把pause修改为false if(pause){
              sleep(3000L);
              pause=false;
    }
    还有一点需要说明的是,暂停3秒期间如果再次设置暂停的话,设置暂停的线程会被暂时挂起,直到3秒结束之后,在下个循环中再次进入下个3秒。如果你不希望在暂停期间,设置暂停的线程被挂起的话,你可以实现一个消息队列。
      

  2.   

    java中不支持A线程将B线程挂起,因为有死锁倾向,所以被屏蔽,但是A线程可以把B线程 interrupt 直接终端。
      

  3.   

    忘记了,应该在sleep之后,把pause修改为false if(pause){
              sleep(3000L);
              pause=false;
    }
    还有一点需要说明的是,暂停3秒期间如果再次设置暂停的话,设置暂停的线程会被暂时挂起,直到3秒结束之后,在下个循环中再次进入下个3秒。如果你不希望在暂停期间,设置暂停的线程被挂起的话,你可以实现一个消息队列。
     private boolean pause; 可以写成 private volatile boolean pause;然后在 public synchronized void pause()方法中就不需要synchronized 同步了吧!
      

  4.   

    用join即可
    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();
    }
    }}