2
System.out.println("Enter the number of what you would like to do");
System.out.println("1 = Manually enter Options");
System.out.println("2 = Use a text file to pick from pre-existing models");
System.out.println("3 = Exit ");


Scanner sc  = new Scanner(System.in);
try {
    runType = sc.nextInt();
    if(runType > 3) {
        throw new badValue(999, "Not the valid input");
    }
} catch (NullPointerException e) {
} catch (badValue e) {
    e.correctBadValue(runType);
} 

switch (runType) {
case 1:
    Thread a = new SelectCarOption();
    a.run();
case 2: 
    Thread a2 = new BuildCarModelOptions();
    a2.run();
case 3:
    System.exit(1); 

}

} }

So basically, I'm trying to run a program where the thread that is running is determined by a variable runType. If runType is one value, a certain thread will run and if it is the other, the other will run. Is my approach the most efficient? Will it turn out to give any errors?

4

5 回答 5

5

长话短说,不,这不是你想做的事情。

  1. thread1.run()不会启动新线程,它只是调用run()当前线程上的代码。你想要的是thread1.start().
  2. thread1.sleep(5000)不会使thread1睡眠,它将使线程睡眠。Thread.sleep是一个影响当前线程的静态方法,并且您使用实例变量来调用它(而不是更传统的Thread.sleep(5000))这一事实并没有改变这一点。
  3. 开始thread2然后立即加入它是没有意义的。你也可以直接在主线程上调用它的代码。(这就是您现在正在做的事情,因为您正在调用thread2.run()而不是thread2.start().)

我不确定你的最终目标是什么,但这听起来像是一个普通的旧多态性的例子。根据输入创建一个Runnable并将其分配给两个具体实现之一;然后就调用run()它。就像是:

Runnable selectStrategy = (runType == 2)
    ? new CarModelOptionsIO()
    : new SelectCarOption()

selectStrategy.run()

如果您需要此操作的结果,您可以使用 a Callable<T>(不要让包名称混淆您;该接口中没有任何固有的并发性)甚至创建您自己的接口,这可以让您为方法提供更有意义的名称(call并且run非常通用)。

于 2013-08-09T18:28:39.007 回答
1

一个程序员遇到了问题。他心想:“我知道了,我会用线来解决的!”。有现在的问题。二他

一个)

你可以更换

    Thread thread1 = new SelectCarOption();
    thread1.start();
    thread1.join();

通过直接执行任何事情run,因为启动线程的线程只是等待。

calling thread   | new thread

   start() ---->
                   run()
   join()        <---

做同样的事情

   run()

现在我们可以将您的代码简化为:

   if (runType == 2) {
       doCarModelOptionsIO();
   } else {
       doSelectCarOption()
   }

你有一个更有效的方法。

二)

不要run()在线程上调用该方法。直接调用的每个方法都在当前线程中执行。Thread具有start()您调用的方法,然后run()从该新线程中调用该方法。

于 2013-08-09T18:30:57.043 回答
0

你的课有很多错误。首先,您使用的是 run() 方法而不是 start()。其次,你应该为你的 sleep() 启动两个线程才有意义。在线查看 Oracle Java Se 教程以了解 Java 多线程模型的基础知识,这将有很大帮助。

于 2013-08-09T18:32:55.787 回答
0

您的代码中有几个错误。并且让您知道,您编写的代码根本不会产生新线程。有几点需要注意:

Thread.sleep() 是一个静态方法。以下代码具有误导性:

try {
  thread1.sleep(5000); //stops thread1 to run different thread 
} catch (InterruptedException e1) {
  e1.printStackTrace();
}

您已经在主线程中启动了 thread1,然后使用新创建的线程调用了 sleep 方法。但这对你没有帮助。它使主线程睡眠而不是线程1。要使 thread1 进入睡眠状态,您需要在该 thread1 类的 run() 中调用 sleep 方法。
此外, sleep() 是一个静态方法,不应该使用线程实例调用,这是一种误导。

同样停止一个线程并不一定意味着它将调用另一个线程。请记住,在线程方面,很少有保证。

还有一件事 :

thread1.run(); // This is incorrect

利用thread1.start()

直接调用 run() 方法不会启动新线程。您需要调用 start() 方法来启动一个新线程。直接调用run方法会在同一个线程中执行run方法的内容(从它被调用的地方)

于 2013-08-09T18:25:33.510 回答
0

总的来说,您的代码很混乱。如果您还没有阅读并发教程,我建议您阅读。如果您已阅读它们,请查看它们。也许自己做一些,然后回到这个问题。

你说:

如果 runType 是一个值,则某个线程将运行,如果是另一个,则另一个将运行。

要做到这一点,你需要这样的东西......

    if (runType == 2) {
        Thread thread1 = new SelectCarOption();
        thread1.run();
        try {
            //join blocks until thread 1 terminates. We don't know that it
            //ever will give your code
            thread1.join(); //stops thread1 to run different thread 
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        Thread thread2 = new CarModelOptionsIO();
        thread2.run();
        try {
            //blocks again, until thread 2 is done running.
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    } else {

        try {
            thread1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //start some other thread here since runType is different?
    }
于 2013-08-09T18:28:06.847 回答