首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有executor框架的多个任务

带有executor框架的多个任务
EN

Stack Overflow用户
提问于 2017-01-04 10:20:22
回答 2查看 7K关注 0票数 0

我正在编写一个程序来实现两个不同的任务,执行器框架作为学习多线程的一部分。早些时候,我使用同步方法来完全满足这个要求,但是它给出了错误的结果。然后,我了解到使用Executor是更好的线程管理方法。

下面的使用同步方法

代码语言:javascript
运行
复制
import java.io.*;
import java.util.Scanner;
import java.nio.*;
class FileWriteThreadExample implements Runnable{
    /*This class needs to write some content into text file*/

    public synchronized void run() {
            StringBuilder thisProgamMessage = new StringBuilder();

            try(FileWriter fw = new FileWriter("C:\\TestNotes.txt", true);
                BufferedWriter bw = new BufferedWriter(fw);
                PrintWriter out = new PrintWriter(bw))
            {
                for(int i=1; i<=50;i++){
                    //Thread.sleep(500);
                    //System.out.println(i);

                    thisProgamMessage.append(i+":"+Math.random()+"\n");

                }
                out.println(thisProgamMessage.toString());
            } catch (IOException e) {
                //exception handling left as an exercise for the reader
            }

    }
}

class FileWriteThreadExample2 implements Runnable{
    /*This class needs to write some content into text file*/

    public synchronized void run() {
            StringBuilder thisProgamMessage = new StringBuilder();
            try(FileWriter fw = new FileWriter("C:\\TestNotes.txt", true);
                BufferedWriter bw = new BufferedWriter(fw);
                PrintWriter out = new PrintWriter(bw))
            {


                System.out.println("Starting Second Write Thread Task");
                for(int i=50; i>=1;i--){
                    //Thread.sleep(500);
                    //System.out.println(i);
                    thisProgamMessage.append(i+"====>"+Math.random()+"\n");
                }
                out.println(thisProgamMessage.toString());
                System.out.println("Completing Second Write Thread Task");
            }
            catch (FileNotFoundException fnfe){
                fnfe.printStackTrace();
            }
            catch(IOException ioex) {
                ioex.printStackTrace();
            }
            /*catch(InterruptedException ie){
                ie.printStackTrace();
            }*/     
    }
}
class SynchronizeTest {
        public static void main (String[] args) {
            FileWriteThreadExample t1 = new FileWriteThreadExample();
            FileWriteThreadExample2 t2 = new FileWriteThreadExample2();

            t1.start();

            t2.start();

        }
    }

这里的问题是,我不知道如何为执行程序编写代码来执行两个任务。我用ExecutorService实现了运行单个任务的代码,即

代码语言:javascript
运行
复制
ExecutorService es = Executors.newFixedThreadPool(5);
    public void doStuff() {


        es.submit(new MyRunnable());


    }

最后,有人能建议我用Executor Framework实现两个不同的任务吗?

PS:请让我知道在理解问题陈述时是否有任何混淆。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-04 10:36:53

你很亲密:

代码语言:javascript
运行
复制
ExecutorService es = Executors.newFixedThreadPool(5);
public void doStuff() {
    es.submit(new FirstTask());  // FirstTask implements Callable
    es.submit(new SecondTask());  // SecondTask implements Callable
}

或者另一种选择:

代码语言:javascript
运行
复制
ExecutorService es = Executors.newFixedThreadPool(5);
public void doStuff() {
    Collection<Callable> tasks = Arrays.asList(new Callable[]
            { new FirstTask(), new SecondTask() });
    es.invokeAll(tasks);
}

每个任务可能像正常情况一样彼此同步,就像您自己在原始线程中运行任务一样。

请注意,ExecutorService需要Callable接口,而不是Runnable接口。

票数 3
EN

Stack Overflow用户

发布于 2017-01-04 10:36:33

我不知道你的锻炼意图。在同步版本中。你什么都不同步。这两个线程依次访问TestNotes.txt,因为只有一个文件可以打开一个在moment.is上写入的文件--这是您的意图吗?

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

https://stackoverflow.com/questions/41461410

复制
相关文章

相似问题

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