繁体   English   中英

如何修复卡住的线程Join()

[英]How do you fix a Thread Join() that is stuck

我是多线程的新手,我只是通过尝试使用线程来打印14000大小的String Arraylist来开始实践。 我没有考虑效率,甚至没有用。 我只想了解线程概念。

我的输出非常错误,并且尝试了各种同步和其他失败的尝试。 目前,我遇到了一个名为Join的工具,但是我的程序没有退出并保持运行状态。 我调试了代码,程序陷入了第一个线程连接中,我想不出任何理由或解决方案来解决该问题。

解决这个问题的方法是创建4个线程来拆分打印任务。然后我将等待所有线程都完成并立即使用连接,然后再关闭输出文件。

public class Threadprinting implements Runnable{
private static List<String> list;
private Thread T1,T2,T3,T4;
public void printinput(List<String> store){
    list=new ArrayList<String>(store);
    Threadprinting threadprinting=new Threadprinting();
    Threadprinting.generatethreads();   
}

public void generatethreads() {
    T1=new Thread(this,"t1");
    T1.start();
    T2=new Thread(this,"t2");
    T2.start();
    T3=new Thread(this,"t3");
    T3.start();
    T4=new Thread(this,"t4");
    T4.start();
}

public void run(){
    try {               
        PrintWriter out = new PrintWriter(new FileWriter("Output.txt"));
        switch (Thread.currentThread().getName()) {
            case "t1":
                System.out.println("Thread "+ Thread.currentThread().getName() + " is running");
                for (int i = 0; i < list.size() / 4; i++) {
                    out.println((list.get(i)));
                }
                break;
            case "t2":
                System.out.println("Thread "+ Thread.currentThread().getName() + " is running");
                for (int i = list.size() / 4; i < list.size() / 2; i++) {
                    out.println((list.get(i)));
                }
                break;
            case "t3": 
                System.out.println("Thread "+Thread.currentThread().getName()+" is running");
                for (int i = list.size()/2; i < list.size()/4+list.size()/2; i++) {
                    out.println((list.get(i)));
                }
                break;
            case "t4": 
                System.out.println("Thread "+Thread.currentThread().getName()+" is running");
                for (int i = list.size()/4+list.size()/2; i < list.size(); i++) {
                    out.println((list.get(i)));
                }
                break;
            default:
                System.out.println("filler");
                break;
            }
            jointhreads();
            out.close();
    }
    catch(IOException e){
        System.out.println("problem came from here");
    }
}

特别:

private void jointhreads() {
    try {
        T1.join();
        T2.join();
        T3.join();
        T4.join();
    } catch (InterruptedException e) {
        System.out.println("the joins failed");
    }
}

}

根据调试器,程序无法终止,并保持在T1.join上运行。

您正在要连接的线程内调用jointhreads ,因此T1基本上是在等待T1 (自身)终止,但这永远不会发生。

您应该在主线程中调用jointrheads ,以便应用程序将等待,直到所有辅助线程完成其工作为止

该声明

T1.join();

表示:“ 当前线程必须等待,直到T1终止”。 您的问题是当前线程是T1。

所以,这是我暂停跑步直到到达终点的一种方式 (即死锁)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM