我正在尝试使两个线程工作simultaneous
。第一个应该每秒递增一个值,并将该值打印到屏幕。第二个,应该,每次增加一个值时,要求输入一些值,然后打印该值。
当我运行我的代码时,增量进展顺利,但是stdin
只是问我一次输入,而不是简单的不再继续在repeater.join()上(但它会进入尝试)。
我的主要话题:
public class mainThread extends Thread
{
//global variables
public int contador=0;
public int maxcont=10;
public void incContador()
{
this.contador++;
}
public void run()
{
Thread repeater = (new Thread(new repeatThread()));
repeater.start();
for(int i=0; i<maxcont; i++)
{
incContador();
try{
//It's asked to increment 1 unit each second
Thread.sleep(1000);
}catch(InterruptedException e){System.out.println("Deu erro!\n");}
System.out.println(contador);
try{
//use my other thread
repeater.join();
}catch(InterruptedException e){System.out.println("Deu erro 2!\n");}
}
}
public static void main(String[] args)
{
(new mainThread()).start();
}
}
我的转发帖线程
public class repeatThread implements Runnable
{
public void run()
{
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
String s = "";
try{
s = buf.readLine();
System.out.println("Input is: "+s);
}
catch(IOException e){System.out.println("MyThreadRepeater - readLine() method error");}
}
public static void main(String[] args)
{
(new Thread(new repeatThread())).start();
}
}
答案 0 :(得分:0)
我相信你误解了Thread#join()
的作用。这一行
repeater.join();
阻止您正在执行的当前线程,并等待repeater
Thread
表示的线程结束。
您的repeater
Thread
正在使用repeatThread
对象,只需要输入一次和结束。
为什么您希望它能够提示用户提供更多输入?
答案 1 :(得分:0)
我没有完全回答你的问题。但是你的转发器代码只执行
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
String s = "";
try{
s = buf.readLine();
System.out.println("Input is: "+s);
}
catch(IOException e){System.out.println("MyThreadRepeater - readLine() method error");}
}
代码只有一次。在循环中运行它以连续运行它。
答案 2 :(得分:0)
您的repeatThread只运行一次。如果你不想改变它的代码,你必须在每次迭代时创建新的repeatThread对象。我的意思是:
public void run()
{
for(int i=0; i<maxcont; i++)
{
Thread repeater = (new Thread(new repeatThread()));
repeater.start();
incContador();
try{
//It's asked to increment 1 unit each second
Thread.sleep(1000);
}catch(InterruptedException e){System.out.println("Deu erro!\n");}
System.out.println(contador);
try{
//use my other thread
repeater.join();
}catch(InterruptedException e){System.out.println("Deu erro 2!\n");}
}
}
当您需要多个线程在特定点互相等待时,最好使用Barriers(例如CyclicBarrier)。我还应该提一下Thread.sleep(1000);可以保持线程至少休眠一秒钟,但不完全是。