线程作为对象Java

时间:2016-03-07 02:39:36

标签: java multithreading collections concurrency runnable

我想要一组继承自Thread的对象;每个对象都在其自己的线程中运行。

我尝试extends Thread并致电super(),认为确保创建新线程;但是没有...只有main是正在运行的线程:(

每个人都告诉我,"实现Runnable将您想要的代码放在run()中并将其放入线程对象"中。 由于两个原因,我无法做到这一点:

  1. 我的收藏元素不属于Thread类型,如果我变形,我将不得不改变它的所有依赖关系。

  2. run()无法包含整个课程......对吗?

  3. 所以我想首先知道,如果我想做的事情是可能的,那么 其次,如果是这样,怎么做?

2 个答案:

答案 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();  
        }
    }
}