菜鸟求问Java关于线程的问题!!

问题是这样的,尝试开发一个窗体,在窗体内有两个按钮,一个start,一个stop,当点击start按钮时在控制台持续打印一句话,当用户点击stop按钮时控制台打印结束。我的源代码是这样的,不知道哪里出错了,按下start以后就按不动stop了,求大神解答!

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Thread22 extends Frame {
Boolean flag = true;
Button b1;
Button b2;
public static void main(String[] args) {
new Thread22().F();
}

    public void F(){
        b1 = new Button("start");
        b2 = new Button("stop");

        add(b1, BorderLayout.NORTH);
        add(b2, BorderLayout.CENTER);
        new B1().start();
        new B2().start();
        pack();
        setVisible(true);
}

    class B1 extends Thread{

        public void run() {
            b1.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e) {
                    while(flag){
                        System.out.println("start");
                    }
                }

            });
        }

    }

    class B2 extends Thread{

        public void run() {
            b2.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e) {
                    flag = false;
                }

            });
        }

    }

}

5个回答

确实是线程阻塞,,你开始了一个线程绑定了b1点击事件 绑定完了线程结束了 ,当你点击执行的时候就不是线程在执行了是当前线程在执行.并且flag=true 所以当前线程永远都在打印start

xinyu2880
xinyu2880 回复蔷薇夜月: 我懂了 谢谢你!
接近 5 年之前 回复
xinyu2880
xinyu2880 回复蔷薇夜月: 你好 ,我的本意是一个线程绑定一个按钮的监听器 ,start按钮被按下以后不断打印start,然后这时再按下stop把flag设成false ,结束start的打印,这是我的本意。可是按下start以后为什么不能按stop了呢,有什么修改建议吗?谢谢
接近 5 年之前 回复

为何要写两个线程添加监听器?添加监听器的操作都放在主线程里,点击start后创建一个打印线程就行,不要一上来就直接启动线程

xinyu2880
xinyu2880 回复DoctorQ: 非常感谢 我尝试一下
接近 5 年之前 回复

图片说明

在Stop按钮被按下事件发生之前,线程B2已经结束了,所以这个stop按钮根本没有效果。在B2中打印一句话就可以看出B2线程早就结束了。

  class B2 extends Thread{

        public void run() {
            System.out.println("stop is clicked...");
            b2.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e) {
                    System.out.println("stop is clicked...");
                    flag = false;
                }

            });
        }

    }
wojiushiwo945you
毕小宝 回复xinyu2880: 不是的,B2是由 new B2().start();这行代码启动的。
接近 5 年之前 回复
wojiushiwo945you
毕小宝 回复xinyu2880: 线程的run方法结束了,线程也就销毁了。
接近 5 年之前 回复
xinyu2880
xinyu2880 回复毕小宝: 为什么会这样呢?B2不应该是我按下按键b2才开始调用的么?谢谢...
接近 5 年之前 回复

谢谢大家 我明白了~

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问