多线程 Thread类 Runnable接口 线程池

Thread

创建新执行线程有两种方法。

一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。创建对象,开启线程。run方法相当于其他线程的main方法。

 

创建线程的步骤:

1 定义一个类继承Thread。

2 重写run方法。

3 创建子类对象,就是创建线程对象。

4 调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法。

    public static void main(String[] args) {
        //创建线程对象
        MyThread mt=new MyThread();
        //开启线程
        mt.start();
        //静态不能调用非静态,非静态能调用静态
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
                
    }

l 另一种方法是声明一个实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。

 

创建线程的步骤。

1、定义类实现Runnable接口。

2、覆盖接口中的run方法。。

3、创建Thread类的对象

4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。

5、调用Thread类的start方法开启线程。

public static void main(String[] args) {
        //创建线程任务对象
        MyRunnable mr=new MyRunnable();
        //创建线程对象并明确线程任务
        Thread th=new Thread(mr);
        //开启线程
        th.start();
        //描述主线任务
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+":"+i);
        }

    }

l Thread.currentThread()获取当前线程对象

l Thread.currentThread().getName();获取当前线程对象的名称

 

 线程池

 使用线程池方式--Runnable接口

l Executors:线程池创建工厂类

l ExecutorService:线程池类

l Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用

l

使用线程池中线程对象的步骤:

  创建线程池对象

  创建Runnable接口子类对象

  提交Runnable接口子类对象

  关闭线程池

    public static void main(String[] args) {
        //创建线程任务对象
        MyRunnable02 mr=new MyRunnable02();
        //获取线程池对象
        ExecutorService es=Executors.newFixedThreadPool(2);
        //调用方法执行线程任务
        es.submit(mr);
        es.submit(mr);
        //销毁线程池
        es.shutdown();
    }

 使用线程池方式Callable接口

l Callable接口

l ExecutorService:线程池类

l Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用

l 使用线程池中线程对象的步骤:

  创建线程池对象

  创建Callable接口子类对象

 提交Callable接口子类对象

  关闭线程池

用线程实现异步计算
2个线程,一个计算1-100的和返回,一个计算1-200的和返回

package com.oracle.demo02;

import java.util.concurrent.Callable;

public class MyCallable2 implements Callable<Integer>{
    private int num;
    public MyCallable2(int num){
        this.num=num;
    }
    
    public Integer call() throws Exception {
        int sum=0;
        for(int i=1;i<=num;i++){
            sum=sum+i;
        }
        return sum;
    }

}
package com.oracle.demo02;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Demo04 {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //用线程实现异步计算
        //2个线程,一个计算1-100的和返回,一个计算1-200的和返回
        //创建线程任务对象
        MyCallable2 mc1=new MyCallable2(100);
        MyCallable2 mc2=new MyCallable2(200);
        //获取线程池对象
        ExecutorService es=Executors.newFixedThreadPool(2);
        //提交线程任务
        Future<Integer> f1=es.submit(mc1);
        Future<Integer> f2=es.submit(mc2);
        //获取返回值
        System.out.println(f1.get()+"..."+f2.get());
    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/longmingyeyu/p/12773874.html