首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自java.util.concurrent的线程

来自java.util.concurrent的线程
EN

Stack Overflow用户
提问于 2016-12-26 19:51:41
回答 2查看 273关注 0票数 1

我有使用线程的代码,但我不使用java.util.concurrent中的线程,所以我想更改我的代码,但我有一些问题。

代码语言:javascript
复制
Thread thread = new Thread() {
                    public void run() {
                        doSomething();
                    }
                };

我想像这个线程一样使用executor,那么我该怎么做呢?在java.util.concurrent?I中尝试过类似的方法:

代码语言:javascript
复制
ExecutorService executorService = Executors.newCachedThreadPool();
Runnable runnable = new Runnable() {
                    public void run() {
                        //my code doing something
                    }
                };

我还有:

代码语言:javascript
复制
List<Runnable> threadsList = new ArrayList<Runnable>();

我有一个方法:

代码语言:javascript
复制
boolean isAllowedCreateNewThread(Runnable taskToRun){
for(int i = 0; i < threadsList.size(); i++){
        Runnable th = threadsList.get(i);
        if(th.isAlive())doSomething(); //isAlive doesn't work since I have runnable instead of Thread
boolean isAllowed = true ;//I have here some bool function but it doesn't matter
    if(isAllowed){
        threadsList.add(taskToRun);
        //service.submit(taskToRun); 
        executorService.execute(taskToRun);
    }
return isAllowed; 
}

如果我有List<Thread> threadsList = new ArrayList<Thread>();,但没有使用ExecutorService,并且改变了所有运行线程的地方,那么我想我也必须改变,但是如何改变呢?什么是关键字实例线程?Runnable?还是别的什么?我还有:

代码语言:javascript
复制
for(int i = 0; i < threadsList.size(); i++){
        Thread th = threadsList.get(i);
        if(th.isAlive())doSomething(); myThreadName.start();

我必须在java.util.concurrentmyThreadName.start();中将isAlive()更改为类似的内容,因此通常我希望使用Thread类将此代码更改为使用java.util.concurrent中的线程编写代码

EN

回答 2

Stack Overflow用户

发布于 2016-12-26 20:32:09

你可以用下面的代码段替换你的代码。

  1. 创建一个可运行的类。

类MyRunable实现Runnable{ public void run() { doSomething();} private void doSomething() { System.out.println("Thread executor is“+ Thread.currentThread().getId());}}

  • 创建具有所需线程数的executor服务。这将创建一个所需数量的线程池。

int numberOfThreads = 4;//您想要创建ExecutorService服务的线程数=为池中存在的每个线程创建可运行的,并将其分配给您的executor。

for(int i=0;i

样本输出

线程执行是9线程执行是10线程执行是8线程执行是11

因此,整个代码将如下所示:

代码语言:javascript
复制
class MyRunable implements Runnable {
    public void run() {
        doSomething();
    }

    private void doSomething() {
        System.out.println("Thread Executing is " + Thread.currentThread().getId());
    }

    public static void main(String[] args) {
        int numberOfThreads  = 4;  // number of threads you want to create
        ExecutorService service = Executors.newFixedThreadPool(numberOfThreads);

        for(int i=0;i<numberOfThreads;i++){
            Runnable myRunable = new MyRunable();
            service.submit(myRunable);
        }

        service.shutdown();

    }

}
票数 1
EN

Stack Overflow用户

发布于 2016-12-26 20:32:40

您可以使用_java.util.concurren_t中的执行器。

Executor是用来创建和管理线程的,所以你不必直接这么做。

在您的示例中,它将是:

代码语言:javascript
复制
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(() -> doSomething());

有许多类型的执行器,您必须根据调用的上下文来决定使用哪种。

例如,如果你只想拥有一个线程,你可以使用:

代码语言:javascript
复制
Executors.newSingleThreadExecutor();

固定的线程数,即10:

代码语言:javascript
复制
Executors.newFixedThreadPool(10);

或者根据需要创建新的线程:

代码语言:javascript
复制
Executors.newCachedThreadPool();

有关Executor的更多信息,请阅读here

希望能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41330857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档