创建多线程的三种方式

创建Java多线程的方式:
1.实现Runnable接口+run():
    启动:使用静态代理模式
        1.创建真实角色
        2.创建代理角色Thread+引用
        3.代理角色.start()
2.继承Thread+run()
    启动:创建子类对象+对象.start()

在以上两种方式中推荐使用第一种方式,避免单一继承、便于共享资源

3.通过实现Callable接口实现多线程
优点:可以获取返回值
    Callable接口和Future接口
    Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable接口的类都是可以被其它线程执行的任务。
缺点:繁琐
    思路:
        (1)实现Callable接口+重写call方法并创建对象实例
        (2)借助执行调度服务ExecutorService,获取Future对象
                ExecutorService ser=Executors.newFixedThread(1);
                Future result=ser.submit(实例对象);
        (3)获取值:result.get()
        (4)停止服务:src.shutdown();

Callable和Runnable有几点不同:
(1)Callable规定的方法是call(),而Runnable规定的方法是run()
(2)call方法可以抛出异常,而run方法是不能的
(3)Callable的任务执行后可以返回值,运行Callable任务可以拿到一个Future对象,Future表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务的执行情况,可以取消任务的执行,还可以获取任务执行的结果

第一种:

真实角色类:
public class TestThread implements Runnable {
    private boolean flag = true;
    private int num = 0;

    public void stop() {
        this.flag = !this.flag;
    }

    @Override
    public void run() {
        while (flag) {
            System.out.println(Thread.currentThread().getName()+" "+num++);
        }
    }
}
public class TestThread1 {

    public static void main(String[] args) throws InterruptedException {
        TestThread t1=new TestThread();
        Thread proxy=new Thread(t1,"线程A");
        System.out.println(proxy.getName());
        proxy.setName("Test");
        proxy.start();
        System.out.println("启动后的状态 "+proxy.isAlive());
        Thread.sleep(200);
        t1.stop();
        Thread.sleep(100);
        System.out.println("停止后的状态 "+proxy.isAlive());

    }
}

isAlive():判断线程是否还活着;
getName():获取线程名字;

第二种:

public class Wq extends Thread{
    public static void main(String[] args){
        Qe e=new Qe();
        e.start();
    }

}

class Qe extends Thread{
    public void run(){
        System.out.println("Hello!");
    }
}

第三种:

public class wq extends Thread{
    public static void main(String[] args) throws InterruptedException, ExecutionException{
        //创建线程池,大小为2
        ExecutorService ser=Executors.newFixedThreadPool(2);
        Future result1=ser.submit(new Qqq("Hello,"));
        Future result2=ser.submit(new Qqq("Java."));
        ser.shutdown();
    }
}

class Qqq implements Callable{
    String str;
    public Qqq(){
        super();
    }
    public Qqq(String str){
        this.str=str;
    }
    @Override
    public Object call() throws Exception {
        System.out.print(str);
        return null;
    }
}

输出:
Hello,Java.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值