我是多线程的新手,我只是尝试使用线程打印14000大小的字符串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上运行。
答案 0 :(得分:6)
您正在要加入的线程内调用jointhreads
,所以
T1
基本上等待T1
(本身)终止,但这种情况永远不会发生。
您应该在主线程中调用jointrheads
,因此应用程序将等待所有工作线程完成其工作
答案 1 :(得分:1)
声明
T1.join();
表示:&#34; 当前线程必须等到T1终止&#34;。您的问题是当前线程是T1。
所以,它是我暂停我的运行直到我到达终点。 (即死锁)