gpt4 book ai didi

java - 如何重新启动流

转载 作者:行者123 更新时间:2023-12-02 08:46:43 25 4
gpt4 key购买 nike

我有一个表格

public class MainFrame extends JFrame {
private int colThread=0;
MainThread mt=new MainThread("Поток - 1");

public MainFrame()
{
setSize(300,300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel jp = new JPanel();
JButton jb=new JButton("Запустить поток");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
jb.setText("Перезапустить поток");
colThread = colThread + 1;
if (!mt.isInterrupted())
{
mt.interrupt();
}
mt.start();
}
});
jp.add(jb);
add(jp);
}
}

我有一个线程类:

public class MainThread extends Thread{
private int summ;
private String threadName;

public MainThread(String threadName)
{
this.threadName = threadName;
}

@Override
public void run() {
summ = 0;
while(true)
{
summ = summ +1;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.threadName + " " + summ);
}
}
}

我有主课:

public class MainClass {
public static void main(String[] args) {
MainFrame mf = new MainFrame();
mf.setVisible(true);
}
}

问题是当按钮被点击时如何重新启动线程执行。当执行这种形式的程序时,会出现错误,不过这是可以理解的,因为线程工作了,不清楚为什么interrupt()不工作?

最佳答案

来自the documentation of Thread.start() :

It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution.

但是您可以创建 Runnable 的单个实现,并将其重复传递给 Thread 构造函数:

public class MainThread implements Runnable {

然后在您的 MainFrame 类中执行以下操作:

public class MainFrame extends JFrame {
private int colThread=0;
private MainThread task = new MainThread("Поток - 1");
private Thread mt = null;

// ...

public void actionPerformed(ActionEvent arg0) {
jb.setText("Перезапустить поток");
colThread = colThread + 1;
if (mt != null && !mt.isInterrupted())
{
mt.interrupt();
}

mt = new Thread(task);
mt.start();

请注意,线程体负责在中断时干净地退出。中断应始终被视为停止正在执行的操作的请求:

    while(true)
{
summ = summ +1;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break; // Someone wants this method to exit!
}
System.out.println(this.threadName + " " + summ);
}

更好的方法是将 while 循环放在 try/catch 中:

    try {
while(true)
{
summ = summ +1;
Thread.sleep(1000);
System.out.println(this.threadName + " " + summ);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

这将使循环在中断时自动退出。

关于java - 如何重新启动流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61031973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com