多线程学习笔记(二)--线程的三种创建方式

强烈推荐一个大神的人工智能的教程:http://www.captainai.net/zhanghan

介绍

 线程的创建方式主要有两种,第一,继承Thread类,重写run()方法,第二,实现Runnable接口,重写run()方法,除此之外还有一种实现callable接口,重写call()方法。

继承Thread类

 缺点:java语言的特点是支持单继承,所以此种方式,不利于扩展。

/**
 * 第一步:继承Thread类
 * 第二步:重写run方法
 * 第三步:new 相应的类对象
 * 第四步: 调用该类对象的start()方法
 */
public class MyThread extends Thread{
    private int count = 5;

    public synchronized void run(){
        count--;
        System.out.println(this.currentThread().getName() + "count =" + count);
    }

    public static void main(String[] args) {
//        new 相应的类对象
        MyThread myThread = new MyThread();
        //第一种写法,解开注释尝试
        //myThread.start();
        //第二种写法
        Thread t1 = new Thread(myThread,"t1");
        //调用start方法
        t1.start();
    }
}

实现Runnable接口

优点:实现的性质和继承Thread类一样,java可以实现多个接口,这种方式更加的灵活。

/**
 * 第一步:实现Runnable接口
 * 第二步:实现run()方法
 * 第三步:创建类对象
 * 第四步:类对象调用start()方法
 */
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "实现Runnable方式");
    }

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread t1 = new Thread(myRunnable,"t1");
        t1.start();
    }
}

实现callable接口

特点:这种方式中,必须和Future结合使用,对比以上两种方式,以上两种方式没有返回值,实现callable接口的方式支持有返回值。

public class MyFuture {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //第一步:通过Callable接口创建FutureTask对象
        FutureTask<String> ft = new FutureTask<String>(new Callable<String>() {
            //第二步:重写call()方法
            @Override
            public String call() throws Exception {
                return Thread.currentThread().getName();
            }
        });
        //第三步:创建线程t1
        Thread t1 = new Thread(ft);
        //第四步:启动线程
        t1.start();
        //第五步:通过get()方法获得call()方法的返回值
        String result = ft.get();
        System.out.println(result);
    }
}

run()和start()启动区别

 以上几个例子都是调用线程的start()方法启动的线程,当线程调用start()后,start()方法会去新建一个线程,并让这个线程执行run()方法,若直接调用Thread的run()方法,则不会创建新的线程,导致程序还是串行执行的。因此,推荐使用start()方法启动线程而不是run().例子可以参考:线程中run()和start()的区别_dumengzhen的博客-CSDN博客

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值