📜  主应用实现 Runnable |并发编程方法 2

📅  最后修改于: 2022-05-13 01:55:16.594000             🧑  作者: Mango

主应用实现 Runnable |并发编程方法 2

先决条件: Java中并发编程的不同方法

让我们详细看看第二种方法。

  1. 用户拥有实现runnable的主类,这是对编译器的承诺,即该类将具有run方法。
    public class MyClass implements Runnable{
        public void run(){
    
        }
    }
    
  2. 然后,用户使用this关键字将对主应用程序的引用传递给执行方法。
    taskList.execute(this)
    

    这是向编译器传达的一种方式,即当它开始运行特定任务时,将其称为相应的运行方法。

  3. 与方法一相比,这种方法的优势在于 run 方法可以调用主应用程序中的方法,包括私有方法。
  4. 与第一种方法相比,这种方法的缺点竞争条件。我们将 run 方法放在主应用程序中的原因是它可以在主应用程序中处理数据。如果用户启动了多个线程并且他们同时修改了相同的共享数据,则需要担心竞争条件。其次,没有构造函数使得传递构造函数参数变得非常困难,因此每个类都以相同的方式开始。
  5. 示例代码:用户在主类中实现runnable,同一个类还有一堆其他的方法来制作任务队列和调用execute方法。

以下是方法一中解释的反例的方法二实现:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
  
// Concurrent Programming in action
public class MainAppRunnable implements Runnable {
  
    private final int loopLimit;
  
    // Limit till which the counter will run
    private MainAppRunnable(int loopLimit)
    {
        this.loopLimit = loopLimit;
    }
  
    private void startThreads()
    {
  
        // Made the task queue
        ExecutorService taskList
            = Executors.newFixedThreadPool(2);
  
        // Added these to the task queue
        // and made available for execution
        taskList.execute(this);
        taskList.execute(this);
        taskList.execute(this);
        taskList.execute(this);
        taskList.execute(this);
  
        // Stopped new tasks from being
        // added to the task queue
        taskList.shutdown();
    }
  
    @Override
    public void run()
    {
        for (int i = 0; i < loopLimit; i++) {
            System.out.println(
                Thread.currentThread().getName()
                + " Counter: " + i);
        }
  
        // Called private method that is
        // part of the same application
        pause(Math.random());
    }
  
    // Methods that run uses can be private
    // in this approach
    private void pause(double seconds)
    {
        try {
            Thread
                .sleep(Math.round(seconds * 1000.0));
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
  
    // Driver method
    public static void main(String[] args)
    {
        new MainAppRunnable(3).startThreads();
    }
}

输出:

pool-1-thread-1 Counter: 0
pool-1-thread-2 Counter: 0
pool-1-thread-1 Counter: 1
pool-1-thread-1 Counter: 2
pool-1-thread-2 Counter: 1
pool-1-thread-2 Counter: 2
pool-1-thread-2 Counter: 0
pool-1-thread-2 Counter: 1
pool-1-thread-2 Counter: 2
pool-1-thread-2 Counter: 0
pool-1-thread-2 Counter: 1
pool-1-thread-2 Counter: 2
pool-1-thread-1 Counter: 0
pool-1-thread-1 Counter: 1
pool-1-thread-1 Counter: 2