我是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.我怎样才能故意中断任何一个线程,以便我测试引发的异常?
请原谅我的好奇心。
谢谢
我认为'界面中的线程'的句子也很奇怪。有一个线程与否,它使用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();
}
}