Ben*_*.Li 14 java multithreading
我有一个名为MyThread扩展Thread类并实现该run()函数的类.当我想运行它时,我有两种方法:
new MyThread().start()(new Thread(new MyThread)).start();任何人都能区分出来吗?
T.J*_*der 19
因为你说你的课程延伸了 Thread,第二个课程有点多余.在你的第二个例子中,你没有使用你的课程Thread,你只是用它作为一个Runnable.
通常,你要么扩展Thread然后调用它自己的start(你的#1),要么你实现Runnable然后使用a Thread来运行它(你的#2).但你不会扩展Thread,然后使用另一个Thread来运行它.
在一个什么样的不同的术语,如果你需要做任何事情来控制或询问线程,在你的第一个情况下,你使用Thread上的实例方法的类; 在第二种情况下,您将在您创建的实例上使用它们new Thread.如果你扩展Thread但是通过#2运行它,Thread你的实例上的方法是无关紧要的,可能会令人困惑.
最后一点可能更清楚,例子如下:
扩展示例Thread:
class Foo extends Thread {
public void run() {
// ...
}
}
// Create it
Foo foo = new Foo();
// Start it
foo.start();
// Wait for it to finish (for example)
foo.join();
Run Code Online (Sandbox Code Playgroud)
注意我们已经开始并通过foo引用加入了线程.
实施示例Runnable:
class Foo implements Runnable {
public void run() {
// ...
}
}
// Create it
Foo foo = new Foo();
// Create a Thread to run it
Thread thread = new Thread(foo);
// Start it
thread.start();
// Wait for it to finish (for example)
thread.join();
Run Code Online (Sandbox Code Playgroud)
注意我们已经开始并通过thread引用加入了线程.
不要这样做:
class Foo extends Thread {
public void run() {
// ...
}
}
// Create it
Foo foo = new Foo();
// Create a Thread to run it -- DON'T do this
Thread thread = new Thread(foo);
// Start it
thread.start();
Run Code Online (Sandbox Code Playgroud)
......因为现在你有Thread#join上均可用foo和thread; 哪个是正确的?(答案是:一个thread,但它很混乱,所以最好不要这样做.)
好吧,你有两种方法来实现多线程。
扩展Thread并使用new MyThreand().start()来启动您的线程。
实现Runnable接口。在这种情况下,您可以使用(new Thread(new MyThread)).start(); 启动一个线程。
详细信息请参考oracle官方文档。
| 归档时间: |
|
| 查看次数: |
1789 次 |
| 最近记录: |