澄清输出'使用可运行接口的三个线程'

问题描述 投票:-1回答:1

我是Java的初学者,遇到了多线程。

0.我对“单线程中的多个可运行接口”和“单个可运行接口中的多个线程”的使用感到有点困惑。有什么区别,请以外行人的话来说?

1.我是否正确地说下面的代码是“单个可运行接口中的多个线程”?

这就是我所做的:

class NewThread implements Runnable{
    Thread t1, t2, t3;
    NewThread(){
        t1 = new Thread(this, "Demo Thread 1");
        t2 = new Thread(this, "Demo Thread 2");
        t3 = new Thread(this, "Demo Thread 3");
        t1.start(); //it automatically invokes run() method
        t2.start();
        t3.start();
    }

    public void run(){
        try{
            System.out.println("Child Thread 1: "+t1);
            t1.sleep(1000);
            System.out.println("Child Thread 2: "+t2);
            t2.sleep(1000);
            System.out.println("Child Thread 3: "+t3);
            t3.sleep(1000);
        }
        catch(InterruptedException e){
            System.out.println("Child Interrupted.");
        }
        System.out.println("Exiting child thread.");
    }
}
public class Main{
    public static void main(String[] args) {
        NewThread NT = new NewThread();
    }
}

这是输出:

Child Thread 1: Thread[Demo Thread 1,5,main]
Child Thread 1: Thread[Demo Thread 1,5,main]
Child Thread 1: Thread[Demo Thread 1,5,main]
Child Thread 2: Thread[Demo Thread 2,5,main]
Child Thread 2: Thread[Demo Thread 2,5,main]
Child Thread 2: Thread[Demo Thread 2,5,main]
Child Thread 3: Thread[Demo Thread 3,5,main]
Child Thread 3: Thread[Demo Thread 3,5,main]
Child Thread 3: Thread[Demo Thread 3,5,main]
Exiting child thread.
Exiting child thread.
Exiting child thread.

2.为什么输出就像一个循环,我的意思是: Child Thread 1 ... Child Thread 1 ... Child Thread 1 ... Child Thread 2 ... Child Thread 2 ... Child Thread 2 ...

如果我评论t2然后输出变成: Child Thread 1 ... Child Thread 1 ... Child Thread 3 ... Child Thread 3 ...

更新1

我期望输出为:

Child Thread 1 Thread[Demo Thread 1,5,main]
Child Thread 2 Thread[Demo Thread 2,5,main]
Child Thread 3 Thread[Demo Thread 3,5,main]
Exiting child thread.
Exiting child thread.
Exiting child thread.

3.所有这些线程是否都在JVM中同时执行?

4. 5中的main... 5,main]被打印为线程对象是什么?

更新2

我将try部分代码更新为:

System.out.println(Thread.currentThread().getName());
System.out.println("Child Thread 1: "+t1);
t1.sleep(1000);
System.out.println(Thread.currentThread().getName());
System.out.println("Child Thread 2: "+t2);
t2.sleep(1000);
System.out.println(Thread.currentThread().getName());
System.out.println("Child Thread 3: "+t3);
t3.sleep(1000);

现在输出对我来说更加困惑:

Demo Thread 2
Demo Thread 3
Demo Thread 1
Child Thread 1: Thread[Demo Thread 1,5,main]
Child Thread 1: Thread[Demo Thread 1,5,main]
Child Thread 1: Thread[Demo Thread 1,5,main]
Demo Thread 1
Demo Thread 2
Demo Thread 3
Child Thread 2: Thread[Demo Thread 2,5,main]
Child Thread 2: Thread[Demo Thread 2,5,main]
Child Thread 2: Thread[Demo Thread 2,5,main]
Demo Thread 2
Demo Thread 1
Child Thread 3: Thread[Demo Thread 3,5,main]
Demo Thread 3
Child Thread 3: Thread[Demo Thread 3,5,main]
Child Thread 3: Thread[Demo Thread 3,5,main]
Exiting child thread.
Exiting child thread.
Exiting child thread.

5.订单也改变了(在不同的运行中)......究竟发生了什么?

6.由于我在初始化期间使用this作为t1 t2 & t3,它们基本上是相同的线程吗?如果不是,那是什么意思?

7.我怎样才能故意中断任何一个线程,以便我测试引发的异常?


请原谅我的好奇心。

谢谢

java multithreading runnable
1个回答
-1
投票

我认为'界面中的线程'的句子也很奇怪。有一个线程与否,它使用Runnable接口来定义它内部的功能。一旦你调用t.start(),你就有了一个新线程。

2:输出看起来像一个循环,因为所有3个线程执行第一次打印,然后是第二次打印,然后执行线程。查看当前线程的更好方法是打印Thread.currentThread().getName()

3:是的

4:Thread.toString()打印线程的名称,优先级和线程组。因此'main'是初始主线程以及此线程组的名称。

- 我认为你的错误观念来自于你有一个名为NewThread的类,但它实际上是一个Runnable,而不是一个线程。尝试理解这个例子:

public class Main
{
  public static class NewRunnable implements Runnable
  {
    public void run()
    {
      try {
        String myName = Thread.currentThread().getName();
        for (int i = 0; i < 5; i++) {
          System.out.println("Child Thread: " + myName );
          Thread.sleep(1000);
        }
      }
      catch (InterruptedException e) {
        System.out.println("Child Interrupted.");
      }
      System.out.println("Exiting child thread.");
    }
  }

  public static void main(String[] args)
  {
    Thread t1 = new Thread(new NewRunnable(), "Demo Thread 1");
    Thread t2 = new Thread(new NewRunnable(), "Demo Thread 2");
    Thread t3 = new Thread(new NewRunnable(), "Demo Thread 3");
    t1.start(); // it automatically invokes run() method
    t2.start();
    t3.start();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.