Java多线程 (六)—— 创建线程的三种方式


一、继承Thread类

(1)创建MyThread1类,让其继承 Thread 类并重写 run() 方法;
(2)创建MyThread1类的对象;
(3)调用线程对象的start()方法启动线程。
示例代码如下:

public class MyThread {
    public static void main(String[] args) {
        MyThread1 myThread1 = new MyThread1();
        myThread1.start();
    }
}
class MyThread1 extends Thread {
    @Override
    public void run() {
        for (int i=0;i<5;i++) {
            System.out.println("MyThread1输出:" + i);
        }
    }
}

执行结果如下:

MyThread1输出:0
MyThread1输出:1
MyThread1输出:2
MyThread1输出:3
MyThread1输出:4

二、实现Runnable接口

(1) 创建MyRunnable 类实现 Runnable 接口;
(2)创建 MyRunnable 类的实例对象 myRunnable ;
(3)把MyRunnable任务对象交给Thread处理;
(4)调用线程对象的start()方法启动线程。
示例代码如下:

public class ThreadRunnable {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

class MyRunnable implements Runnable {

    @Override
    public void run() {
        for (int i=0;i<5;i++) {
            System.out.println("MyRunnable输出:" + i);
        }
    }
}

执行结果如下:

MyRunnable输出:0
MyRunnable输出:1
MyRunnable输出:2
MyRunnable输出:3
MyRunnable输出:4

相比继承Thread,实现Runnable接口扩展性更强,因为它还可以继续继承其他类和实现接口

二、实现Callable接口

(1)创建 MyCallable 类实现 Callable 接口;
(2)创建 MyCallable 类的实例对象 myCallable;
(3)把实例对象 myCallable 作为参数来创建 FutureTask 类的实例对象 futureTask;
(4)把实例对象 futureTask 作为参数来创建 Thread 类的实例对象 thread,实例对象 thread 就是一个新线程;
(5)调用Thread的start方法启动线程,执行任务。
示例代码如下:

public class ThreadCallable {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable myCallable = new MyCallable(5);
        FutureTask<Integer> futureTask = new FutureTask(myCallable);
        Thread thread = new Thread(futureTask);
        thread.start();
        System.out.println("MyCallable执行结果为:" + futureTask.get());
    }
}

class MyCallable implements Callable<Integer> {
    private int a;
    public MyCallable(int a) {
        this.a = a;
    }
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i=0;i<a;i++) {
            sum += i;
        }
        return sum;
    }
}

执行结果如下:

MyCallable执行结果为:10

FutureTask 类提供了一个 get() 方法用来获取 call() 方法的返回值,但需要注意的是调用这个方法会导致程序阻塞,必须要等到线程结束后才会得到返回值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值