作为对象的线程 Java
A Thread as an object Java
我想要一个继承自 Thread
的对象集合;每个对象 运行 在它自己的线程中。
我尝试了 extends Thread
并调用了 super()
,认为这样可以确保创建一个新线程;但是不...只有 main
是 运行 线程 :(
每个人都告诉我,"implement Runnable
put the code you want in run()
and put it in a thread-object"。
由于两个原因,我不能这样做:
我的集合元素不是 Thread
类型,如果我变形我将不得不更改它的所有依赖项。
run()
不能包含整个 class... 对吗?
所以我首先想知道,如果我想做的事情是可能的,并且
其次,如果可以,怎么做?
super()
只是调用父构造函数(在你的例子中是默认的 Thread
构造函数)。真正启动新线程的方法是start()
。正如其他人所说,扩展 Thread
.
是糟糕的设计
是的,您可以创建一个实现 Runnable
的 class
class MySpecialThread implements Runnable {
public void run() {
// Do something
}
}
您可以像这样在新线程中启动它:
Thread t = new Thread(new MySpecialThread());
// Add it to a collection, track it etc.
t.start(); // starts the new thread
1- 您可以使用 Runnables
的集合 或 的 Thread
集合,使用下面的示例。
MySpecialThread m = new MySpecialThread();
List<Runnable> runnables = new ArrayList<Runnable>();
runnables.add(m);
List<Thread> threads = new ArrayList<Thread>();
threads.add(new Thread(m));
2- 一个方法不能包含一个class,但上面的例子MySpecialThread
是一个class,它的行为与任何其他 class。可以写构造函数,添加方法和字段等
我推荐使用ExecutorService
让我们有一个关于 ExecutorService
用法的示例代码
import java.util.*;
import java.util.concurrent.*;
public class ExecutorServiceDemo {
public static void main(String args[]){
ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<Integer>> list = new ArrayList<Future<Integer>>();
for(int i=0; i< 10; i++){
CallableTask callable = new CallableTask(i+1);
Future<Integer> future = executor.submit(callable);
list.add(future);
}
for(Future<Integer> fut : list){
try {
System.out.println(fut.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
executor.shutdown();
}
}
class CallableTask implements Callable<Integer>{
private int id = 0;
public CallableTask(int id){
this.id = id;
}
public Integer call(){
// Add your business logic
return Integer.valueOf(id);
}
}
输出:
1
2
3
4
5
6
7
8
9
10
如果您想使用 Thread 而不是 ExecutorService,下面的代码应该适合您。
import java.util.*;
class MyRunnable implements Runnable{
private int id = 0;
public MyRunnable(int id){
this.id = id;
}
public void run(){
// Add your business logic
System.out.println("ID:"+id);
}
}
public class RunnableList{
public static void main(String args[]){
List<Thread> list = new ArrayList<Thread>();
for ( int i=0; i<10; i++){
Thread t = new Thread(new MyRunnable(i+1));
list.add(t);
t.start();
}
}
}
我想要一个继承自 Thread
的对象集合;每个对象 运行 在它自己的线程中。
我尝试了 extends Thread
并调用了 super()
,认为这样可以确保创建一个新线程;但是不...只有 main
是 运行 线程 :(
每个人都告诉我,"implement Runnable
put the code you want in run()
and put it in a thread-object"。
由于两个原因,我不能这样做:
我的集合元素不是
Thread
类型,如果我变形我将不得不更改它的所有依赖项。run()
不能包含整个 class... 对吗?
所以我首先想知道,如果我想做的事情是可能的,并且 其次,如果可以,怎么做?
super()
只是调用父构造函数(在你的例子中是默认的 Thread
构造函数)。真正启动新线程的方法是start()
。正如其他人所说,扩展 Thread
.
是的,您可以创建一个实现 Runnable
class MySpecialThread implements Runnable {
public void run() {
// Do something
}
}
您可以像这样在新线程中启动它:
Thread t = new Thread(new MySpecialThread());
// Add it to a collection, track it etc.
t.start(); // starts the new thread
1- 您可以使用 Runnables
的集合 或 的 Thread
集合,使用下面的示例。
MySpecialThread m = new MySpecialThread();
List<Runnable> runnables = new ArrayList<Runnable>();
runnables.add(m);
List<Thread> threads = new ArrayList<Thread>();
threads.add(new Thread(m));
2- 一个方法不能包含一个class,但上面的例子MySpecialThread
是一个class,它的行为与任何其他 class。可以写构造函数,添加方法和字段等
我推荐使用ExecutorService
让我们有一个关于 ExecutorService
import java.util.*;
import java.util.concurrent.*;
public class ExecutorServiceDemo {
public static void main(String args[]){
ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<Integer>> list = new ArrayList<Future<Integer>>();
for(int i=0; i< 10; i++){
CallableTask callable = new CallableTask(i+1);
Future<Integer> future = executor.submit(callable);
list.add(future);
}
for(Future<Integer> fut : list){
try {
System.out.println(fut.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
executor.shutdown();
}
}
class CallableTask implements Callable<Integer>{
private int id = 0;
public CallableTask(int id){
this.id = id;
}
public Integer call(){
// Add your business logic
return Integer.valueOf(id);
}
}
输出:
1
2
3
4
5
6
7
8
9
10
如果您想使用 Thread 而不是 ExecutorService,下面的代码应该适合您。
import java.util.*;
class MyRunnable implements Runnable{
private int id = 0;
public MyRunnable(int id){
this.id = id;
}
public void run(){
// Add your business logic
System.out.println("ID:"+id);
}
}
public class RunnableList{
public static void main(String args[]){
List<Thread> list = new ArrayList<Thread>();
for ( int i=0; i<10; i++){
Thread t = new Thread(new MyRunnable(i+1));
list.add(t);
t.start();
}
}
}