JAVA 三种线程实现创建方式

JAVA 三种线程实现/创建方式

方式一:继承Thread类

通过继承Thread类来创建一个自定义线程类。Thread类本质上就继承了Runable接口,代表一个线程类。启动线程的唯一办法就是通过Thread类的start()实例方法。start()方法是一个 native 方法(本地方法),它将启动一个新线程,并执行 run()方法。

public class MyThread extends Thread { 
//重写父类的run方法,实现自定义线程操作
     public void run() { 
        System.out.println("MyThread.run()"); 
    } 
    public static void main(String[] args){
        MyThread myThread1 = new MyThread(); 
        //通过start()启动线程
		myThread1.start();
    }
} 

Java只支持单继承,这也导致了如果使用继承Thread类创建的线程,就无法继承其他类,这也是不推荐使用Thread类创建线程的原因之一。

方式二:实现Runnable接口

如果自己的类已经 extends 另一个类,就无法直接 extends Thread,此时,可以实现一个Runnable 接口来避免这种情况。

public class MyThread implements Runnable { 
     public void run() { 
     	System.out.println("MyThread.run()"); 
     } 
     public static void main(String[] args){
        MyThread myThread1 = new MyThread(); 
        //传入实现runnable接口的实例
		Thread thread = new Thread(myThread); 
         //通过start()启动线程
		thread.start();
    }
}

我们也可以写成这样

public class MyThread{ 
     
     public static void main(String[] args){
        //直接通过匿名类创建线程
		Thread thread = new Thread(new Runnable(){
             public void run() { 
                System.out.println("MyThread.run()"); 
             } 
        }); 
         //通过start()启动线程
		thread.start();
         
         //或者使用lambda表达式,这样更加便捷
        Thread thread2 = new Thread(()->{
                System.out.println("MyThread.run()"); 
         })
        thread2.start();
    }
}

方式三:通过ExecutorService、Callable、Future创建有返回值线程

有返回值的任务必须实现 Callable 接口,类似的,无返回值的任务必须 Runnable 接口。执行Callable 的任务后会放回一个Future 的对象,而这个Future对象上调用 get 就可以获取到 Callable 任务返回的 Object 了。线程池接口 ExecutorService定义了执行Callable接口的方法。

ExecutorService接口定义了submit()方法用于接受提交到线程池的任务,并放回一个Future对象。

Future对象用于获取线程任务放回值,我们通过Future对象的get方法获取放回值。

//创建一个大小为5的线程池
ExecutorService pool = Executors.newFixedThreadPool(5);

// 向线程池提交一个执行任务并获取 Future 对象
Future f = pool.submit(new Callable(){
    public int call() {
        System.out.println("MyThread.run()");
        return 10;
    }
}); 

// 关闭线程池
pool.shutdown(); 
// 获取所有并发任务的运行结果
for (Future f : list) 
	// 从 Future 对象上获取任务的返回值,并输出到控制台
	System.out.println("res:" + f.get().toString()); 
posted @   鸭梨的药丸哥  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示