java使用多线程执行任务

本文详细介绍了Java中如何使用多线程执行任务,包括线程启动的方式、线程的核心方法如`start()`和`run()`,以及线程的常用方法如`sleep()`和`join()`。此外,还讲解了通过实现`Runnable`接口创建任务,以及如何通过`Callable`接口创建有返回值的任务,结合`Future`来获取任务结果。
摘要由CSDN通过智能技术生成

一、线程启动(Thread)

我发现能开启一个新线程的只有Thread类或其子类

  1. 核心方法
    • start() : 我们必须调用此方法,计算机才会真正为我们开辟启动一个新线程

      // java.lang.Thread
      public synchronized void start() {
             
          if (threadStatus != 0)
              throw new IllegalThreadStateException();
          group.add(this);
      
          boolean started = false;
          try {
             
              start0(); // 调用本地方法创建开启线程
              started = true;
          } finally {
             
              try {
             
                  if (!started) {
             
                      group.threadStartFailed(this);
                  }
              } catch (Throwable ignore) {
             
              }
          }
      }
      
    • run(): 此方法是执行我们任务的方法,会在线程创建后自动回调这个方法,我们不需要手动的调用它

      这个方法平时有两种方式去使用它:

      1. 第一种是默认的方式:它会执行传递进来的任务对象的run()方法

        // java.lang.Thread
        @Override
        public void run() {
                 
            if (target != null) {
                 
                target.run(); // 执行传递进来的任务对象的run()方法
            }
        }
        
      2. 第二种就是通过重写此方法,让其去调用我们自定义的任务逻辑

  2. 常用方法
    1. sleep(millis):延时执行

    2. join() :此线程优先执行,可以传递等待时间为参数

    3. interrupt(): 将调用者线程的中断状态设为true

      • 捕获到InterruptedException异常后,当前线程的中断状态已经被修改为false

      • 在执行Object.wait()sleep()join()其他线程而阻塞时会被打断,并抛出InterruptedException异常

      • 在执行LockSupport.park(),被interrupt会马上返回,但是不会抛出InterruptedException异常

      • 虽然InputStreamOutputStream中的readwrite等方法都不会响应中断,但通过关闭底层的套接字,可以使得由于执行read或者write等方法而被阻塞的线程抛出一个SocketException异常而中断

        // 重写interrupt()方法
        public 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现多线程执行任务并计算进度,可以使用Java的线程池和计数器来实现。具体步骤如下: 1. 创建一个线程池,可以使用Java提供的ThreadPoolExecutor类来实现。 2. 将任务分为若干个小任务,提交到线程池中执行。 3. 使用计数器来记录已完成的任务数,每当一个任务执行完成后,计数器加1。 4. 在主线程中不断查询计数器的值,计算已完成任务所占的比例,从而得到任务的进度。 5. 当所有任务执行完成后,关闭线程池。 下面是一个简单的示例代码: ``` import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; public class MultiThreadProgress { public static void main(String[] args) { // 创建线程池 ExecutorService executor = Executors.newFixedThreadPool(4); // 创建计数器 AtomicInteger counter = new AtomicInteger(0); // 提交任务 for (int i = 0; i < 10; i++) { executor.submit(new Task(counter)); } // 循环查询进度 while (counter.get() < 10) { System.out.println("Progress: " + counter.get() + "/10"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } // 关闭线程池 executor.shutdown(); } static class Task implements Runnable { private AtomicInteger counter; public Task(AtomicInteger counter) { this.counter = counter; } @Override public void run() { // 执行任务 // ... // 任务完成后,计数器加1 counter.incrementAndGet(); } } } ``` 在上述代码中,我们创建了一个包含4个线程的线程池,并提交了10个任务。每当一个任务执行完成后,计数器会加1。主线程不断查询计数器的值,计算已完成任务所占的比例,从而得到任务的进度。当所有任务执行完成后,关闭线程池。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值