栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java.多线程四种创建方式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java.多线程四种创建方式

Java中多线程四种创建方式 JDK5之前,对于多线程创建,有两种方式:

方式一: 继承Thread类

实现步骤:
	1 单独定义一个类,(如ThreadTest类),让ThreadTest继承Thread;
	2 从Thread类中继承而来的run()方法进行重写,把线程要做的事情定义在run()里面,
		run()方法内的语句,称为线程执行体;
	3 创建子类对象(ThreadTest) -> 创建线程对象;
	4 使用创建的子类对象调用start()方法,启动线程;
	这里启动线程的机制需要注意:
		- 调用的start()方法为父类中的方法,由父类(Thread)启动线程,
		  JVM虚拟机后台调用run()方法,因为子类(ThreadTest)重写run(),
		  最终调用的就是子类中重写的run()方法;(多态)
代码示例: 
// 1 定义子类继承Thread
class ThreadTest extends Thread{
	// 2 重写父类中的run()方法
	public void run(){
		// 线程语句执行体
	}
}

public class MyThread {
	public static void main(String[] args){
		// 3 创建子类对象
		ThreadTest t1 = new ThreadTest();
		// 4 启动线程
		t1.start();
	}
}

方式二: 实现Runnable接口

实现步骤: 
	1、定义一个类实现Runnable接口;
	2、实现接口中run()抽象方法,把线程要做的事情定义在run()里面,
		run()方法内的语句,称为线程执行体;
	3、创建该类实例化对象;
	4、调用Thread类的有参构造器,把实现类对象作为参数传递进去,得到一个线程对象;
	5、通过线程对象调用start(): ① 启动线程 ② 调用run().
代码示例: 
// 1 定义一个类实现Runnable接口
class ThreadTest implements Runnable{
	// 2 实现接口中的run()抽象方法
	public void run(){
		// 线程语句执行体
	}
}

public class MyThread {
	public static void main(String[] args){
		// 3 创建实例化对象
		ThreadTest t1 = new ThreadTest();
		// 4 调用Thread类的有参构造器,把实现类对象作为参数传递进去,得到一个线程对象;
		Thread t2 = new Thread(t1);
		// 5 启动线程
		t2.start();
	}
}
JDK5之后,添加两种创建方式:

方式三: 使用Callable接口创建线程

实现步骤:
	1 定义实现类实现Callable接口;
	2 实现接口中定义的call(),对于线程要做的事情写在call()方法中;
	3 创建Callable接口的实现类对象;
	4 将Callable实现类的对象,使用FutureTask类来包装;
	5 此FutureTask对象作为Thread对象的target来创建线程;
	6 使用Thread对象调用start()方法,启动线程;
	7 对于实现Callable接口的类,该call()方法具有返回值,这里可以使用FutureTask对象调用get()方法获取返回值;
代码示例: 
// 1 定义实现类实现Callable接口
class MyCallable implements Callable {
	// 2 实现该抽象方法,需要执行的代码写在方法内
    public Integer call() {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
            sum += i;
        }
        return sum;
    }
}

public class ThreadTest {
    public static void main(String[] args) {
    	// 3 创建Callable接口的实现类对象
        Callable myCallable = new MyCallable();
        // 4 FutureTask类来包装步骤3中创建的对象
        FutureTask ft = new FutureTask(myCallable);
        // 5 将FutureTask对象作为Thread对象的target来创建线程
        Thread thread = new Thread(ft);
        // 6 启动线程
        thread.start();
        int sum = 0;
        try {
        	// 7 通过FutureTask对象调用get()方法获取返回值
        	// 此处异常需要处理
            sum = ft.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("sum = " + sum);
    }
}

方式四: 使用线程池创建线程

代码示例: (线程池这里不做赘述,后续讲)
public class ThreadPoolTest {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        for(int i = 1; i <= 20; i++){
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " : 开始执行任务");
                }
            });
        }
        threadPool.shutdown();
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/686441.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号