如何多次重用一个线程?

时间:2015-04-10 07:46:24

标签: java multithreading encryption thread-safety decode

我有这个Pseducode:

  1. 获取用户输入,直到他/她输入“0”
  2. 使用该输入
  3. 调用方法encode(input)
  4. encode方法由此代码调用:
  5. 代码:

    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();
    }
    

    tt = new Thread(this, "Encode");的问题是,一旦用户提供输入,e就无法接受更多输入。我希望用户可以在30秒内输入20个输入,encode需要30秒才能返回输出,所以我希望用户可以输入30个输入,他们将以并行线程处理。

    1. 它提供输出
    2. 这一直持续到0为止 喜欢: 输入

      苹果 猫 狗

    3. 输出(encodes返回,逐个时间)

      OUTPUT1
      OUTPUT2
      OUTPUT3
      

      错误:Exception in thread "main" java.lang.IllegalThreadStateException

      编辑:我使用此class encrypt implements Runnable

4 个答案:

答案 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

    }