我想要一组继承自Thread
的对象;每个对象都在其自己的线程中运行。
我尝试extends Thread
并致电super()
,认为确保创建新线程;但是没有...只有main
是正在运行的线程:(
每个人都告诉我,"实现Runnable
将您想要的代码放在run()
中并将其放入线程对象"中。
由于两个原因,我无法做到这一点:
我的收藏元素不属于Thread
类型,如果我变形,我将不得不改变它的所有依赖关系。
run()
无法包含整个课程......对吗?
所以我想首先知道,如果我想做的事情是可能的,那么 其次,如果是这样,怎么做?
答案 0 :(得分:1)
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
OR 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-方法不能包含类,但上面的示例MySpecialThread
是一个行为与任何其他类一样的类。您可以编写构造函数,添加方法和字段等。
答案 1 :(得分:0)
我建议使用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();
}
}
}