Java 如何修复卡住的线程连接()

Java 如何修复卡住的线程连接(),java,multithreading,Java,Multithreading,我是多线程新手,我只是通过尝试使用线程打印14000大小的字符串数组列表来进行实践。在这件事上,我没有考虑效率,甚至没有考虑有用性;我只是想了解线程的概念 我的输出出现了极大的错误,我尝试了各种同步和其他失败的尝试。我当时遇到了一个名为join的工具,但是我的程序没有退出并保持运行。我调试了代码,程序在第一次线程连接时就卡住了,我想不出任何原因或解决方案来解决这个问题 我解决这个问题的方法是创建4个线程来分割打印任务。然后,我会等到所有线程都完成并在关闭输出文件之前使用连接 public cla

我是多线程新手,我只是通过尝试使用线程打印14000大小的字符串数组列表来进行实践。在这件事上,我没有考虑效率,甚至没有考虑有用性;我只是想了解线程的概念

我的输出出现了极大的错误,我尝试了各种同步和其他失败的尝试。我当时遇到了一个名为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");
    }
}
}

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

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

您应该在主线程中调用jointrheads,因此应用程序将等待所有工作线程完成其任务

T1.join();
意味着:当前线程必须等待T1终止。您的问题是当前线程是T1


所以,我会暂停跑步,直到到达终点。i、 e.死锁

您在T1中,执行T1。加入,这是您的问题吗?非常感谢您的回复。我理解这个问题,但如何从主线程连接线程,同时在out.close语句之前仍保留所有线程。您正在创建4个不同的编写器您的案例通常写得不好,因此每个线程都可以关闭自己的流编写器。您应该在main中创建一个输出,运行将使用该输出的worker,而不是在main中关闭它。另一件事是,写入流不是线程安全的,您应该同步这个过程,但这是另一个问题。是的,在玩了一段时间后,这正是我所做的。但是,我遇到了另一个问题,即如何使线程按照从线程1到线程4的顺序执行打印。我试着设定优先级,但这不是一个可靠的解决方案。但是,在做了一些研究之后,我认为让线程遵循严格的顺序是不可能的。你不能保证并行线程的执行顺序,这只是JVM的具体说明,除非你应用一些奇特的冗余逻辑。但是,如果您想以串行方式打印内容,则没有使用线程的传感器;]
T1.join();