我有这个Pseducode:
encode(input)
encode
方法由此代码调用:代码:
encrypt eddd = new encrypt();
while (!answer.equals("0")) {
System.out.println("Enter String ,or enter 0");
e.text = input.next();
System.out.println("Please wait...");
e.t.start();
}
t
为t = new Thread(this, "Encode");
的问题是,一旦用户提供输入,e
就无法接受更多输入。我希望用户可以在30秒内输入20个输入,encode
需要30秒才能返回输出,所以我希望用户可以输入30个输入,他们将以并行线程处理。
这一直持续到0
为止
喜欢:
输入
苹果 猫 狗
输出(encodes
返回,逐个时间)
OUTPUT1
OUTPUT2
OUTPUT3
错误:Exception in thread "main" java.lang.IllegalThreadStateException
编辑:我使用此class encrypt implements Runnable
答案 0 :(得分:1)
如果您认为最好不要使用其他线程但是在当前线程中执行encrypt方法,请使用相同的线程在这里工作。这是因为程序可能会在威胁完成其工作之前再次启动该线程,这就是您看到此类错误的原因。最好的方法是使用线程池。如果没有可用的线程运行(使用所有线程),程序将等待下一个线程可用。您只需使用ExecutorService创建一个线程池。请参阅下面的代码。如果您需要使用单线程,请使用 Executors.newSingleThreadExecutor()。
ExecutorService executorService = Executors.newFixedThreadPool(10);
// ExecutorService executorService = Executors.newSingleThreadExecutor();
while (!answer.equals("0")) {
System.out.println("Enter String ,or enter 0");
e.text = input.next();
System.out.println("Please wait...");
Encrypt e = new Encrypt();
executorService.submit(e);
}
executorService.shutdown();
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
答案 1 :(得分:0)
您尝试启动已启动的Thread
,其中包含IllegalThreadStateException
。为不同的线程创建Thread
的新实例。例如:
class ClassA extends Thread{
public void run(){
}
}
class ClassB{
public static void main(String arg[]){
List<Thread> threadList=new ArrayList<Thread>();
for (int i=0;i<10;i++){
threadList.add(new ClassA());
}
for (int i=0;i<10;i++){
threadList.get(i).start();
}
}
}
答案 2 :(得分:0)
您每次都在启动相同的帖子
while (!answer.equals("0")) {
System.out.println("Enter String ,or enter 0");
e.text = input.next();
System.out.println("Please wait...");
e.t.start(); ------> Same thread instance
}
而是尝试创建一个新线程
while (!answer.equals("0")) {
System.out.println("Enter String ,or enter 0");
e.text = input.next();
System.out.println("Please wait...");
e.t=new MyCustomThread(); ----> You can instantiate your own thread
e.t.start();------> Same thread instance
}
答案 3 :(得分:0)
这对我有用:
String answer="";
encrypt e=new encrypt();
while (!answer.equals("0")){
System.out.println("Enter String to Encode , else enter 0");
System.out.println("Please wait...");
e.t=new Thread(new encrypt(input.next()));
e.t.start();
}
加密构造函数:
encrypt(String en) {
t = new Thread(this, "Thread_Encode");
this.text = en; // text to be encoded
}