使用Java 8进行线程排序

时间:2017-06-06 07:21:41

标签: java java-8 executorservice

我有一个简单的程序,可以打印两个线程,交替增加数字。

所以, 第一个线程打印:1

第二个帖子打印:2

第一个主题打印:3 ...依此类推

我可以使用'Thread'类来执行此操作。但我想看看如何使用Executor类来做到这一点。

使用以下代码....执行器类似乎不起作用。任何指针??

代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LocksPackagePractice {

    private int i = 0;

    ReentrantLock lock = new ReentrantLock();
    Condition condition = lock.newCondition();  

    Runnable r = () -> {
    for(int x = 0; x < 5; x++){
        printValue();
    }
    printValue(); 
};

    public static void main(String[] args) {

        new LocksPackagePractice().trigger();
    }

    void trigger(){
        ExecutorService service = Executors.newFixedThreadPool(2);
        service.execute(r);
    }

    void printValue(){

        lock.lock();

        try {

            i++;
            System.out.println(Thread.currentThread().getName() + " and value is = " + i);

            condition.signal();         
            condition.await();

        } catch(InterruptedException e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }

    }
}

2 个答案:

答案 0 :(得分:3)

对您的计划进行了一些更改。运行它并检查它是否解决了混乱。

public class LocksPackagePractice {
    private int i = 0;
    ReentrantLock lock = new ReentrantLock();
    Condition condition = lock.newCondition();
    Runnable r = () -> {
        printValue();
    };
    public static void main(String[] args) {
        new LocksPackagePractice().trigger();
    }
    void trigger() {
        ExecutorService service = Executors.newFixedThreadPool(2);
        service.submit(r);
        for (int i = 0; i < 5; i++) {
            service.execute(r);
        }
    }
    void printValue() {
        lock.lock();
        try {
            i++;
            System.out.println(Thread.currentThread().getName() + " and value is = " + i);
            condition.signal();
            condition.await();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

这将为您提供以下输出

pool-1-thread-1 and value is = 1
pool-1-thread-2 and value is = 2
pool-1-thread-1 and value is = 3
pool-1-thread-2 and value is = 4
pool-1-thread-1 and value is = 5
pool-1-thread-2 and value is = 6

答案 1 :(得分:0)

我不确定,但您需要输入订购吗?因为您使用阻塞操作(锁定),并且在性能方面不佳。

此代码:

private AtomicInteger number = new AtomicInteger(0);

  public static void main(String[] args) {
    ExecutorService executor = Executors.newFixedThreadPool(2);

    ForTestApplication testApplication = new ForTestApplication();

    for (int i = 0; i < 100; i++) {
      executor.execute(testApplication::print);
    }

  }

  public void print () {
    System.out.println(Thread.currentThread().getName() + " : " + number.incrementAndGet());
  }

使用AtomicInteger代替简单int值和锁定操作。但输出顺序可能是这样的:

pool-1-thread-1 : 1
pool-1-thread-2 : 2
pool-1-thread-1 : 3
pool-1-thread-1 : 4
pool-1-thread-2 : 5
pool-1-thread-2 : 7
pool-1-thread-1 : 6
pool-1-thread-2 : 8
pool-1-thread-1 : 9
pool-1-thread-2 : 10

您需要在输出中订购,然后需要考虑如何处理它。