问各位大哥一个多线程问题

RenaissanceSKY 2021-05-26 09:54:50
我有五个字符串
String [] strings = new String[]{"a","b","c","d","e"};

开启五个线程进行执行
ExecutorService executorService = Executors.newFixedThreadPool(5);


要求是每个线程开启后,每个字符串和一个字符串"B"做拼接,要求是aB、bB、cB、dB、eB顺序执行。每个字符串只能处理一次。

老哥们有什么思路提供吗?或者写一下提供如何来做。万分感谢!
...全文
563 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2021-06-07
  • 打赏
  • 举报
回复

    public static void main(String[] args) throws IOException, InterruptedException {

        String [] strings = new String[]{"a","b","c","d","e"};
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i=0; i<strings.length; i++) {
            final int index = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    strings[index] = strings[index] + "B";
                }
            });
        }
        executorService.shutdown();
        executorService.awaitTermination(5L, TimeUnit.SECONDS);

        for (String string : strings) {
            System.out.println(string);
        }
    }

每个线程都计算独立的数据,所以,不存在互斥和临界区的问题。只要等待所有线程计算完成即可输出结果。

  • 打赏
  • 举报
回复
 private volatile static int sig = 0;

    public static void main(String[] args) {
        String [] strings = new String[]{"a","b","c","d","e"};
        String append = "B";
        ReentrantLock lock = new ReentrantLock();

        Condition[] conditions = new Condition[5];
        for (int i=0;i<5;i++){
          conditions[i] = lock.newCondition();
        }
        for (int i=0;i<5;i++){
            int j= i;
            new Thread(()->{
                lock.lock();
                try {

                    if(sig != j){
                        conditions[j].await();
                    }
                    System.out.println(strings[j]+append);
                    Thread.sleep(100);
                    sig = j+1;
                    if(j+1<5){
                        conditions[j+1].signal();
                    }
                }catch (Exception e){
                    e.printStackTrace();

                }finally {
                    lock.unlock();
                }
            }).start();
        }
    }
结果: aB bB cB dB eB
得一以生 2021-05-27
  • 打赏
  • 举报
回复
多线程是无法保证线程的执行顺序的,如果你要保证顺序的话,只能通过队列,或者监听去实现,但是这样就相当于是串行了,失去了多线程的意义,多线程的目的就是并发处理多个任务,达到最终结果。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧