作为对象的线程 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"。 由于两个原因,我不能这样做:

  1. 我的集合元素不是 Thread 类型,如果我变形我将不得不更改它的所有依赖项。

  2. 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();  
        }
    }
}