多线程 Thread类 Runnable接口 线程池
Thread类
创建新执行线程有两种方法。
l 一种方法是将类声明为 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()); } }