阿里P5-多线程相关

阿里P5-多线程相关

1.Callable和Runnable的区别是什么?
首先Callable和Runnable都是用来实现多线程的接口,都可以用Thread.run()来启动线程。下面直接看一下源码:

	class c implements Callable<String>{
		@Override
		public String call() throws Exception {
			return null;
		}
	}
	
	class r implements Runnable{
		@Override
		public void run() {
		}
	}

从上面我们不难看出Callable和Runable接口的的核心分别在于实现call()方法和run()方法。而且可以容易的看出run()方法没有返回值,也不能抛出异常,但是call方法的是可以有返回值的还是一个泛型而且能够抛出异常,同时和Future、FutureTask配合可以用来获取异步执行的结果。虽然Callalble接口支持返回执行结果,但是需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用就不会阻塞。
2.Thread类中的start()和run()方法有什么区别?
首先我们要知道thread线程有5种状态,创建-就绪-运行-阻塞-死亡这五种,那么我们的start方法呢就是就绪这一步,因为这个时候我们的线程并没有立即的执行,而是得等待,等到我们的cpu有空闲的时候,才会执行线程里面的run方法,等run方法执行完了,线程就结束了。只有start方法才真正实现了多线程运行,因为这个时候不用等待我们的run方法执行完成就可以继续执行下面的代码。start()方法被用来启动新创建的线程,而且start()内部调用了run()方法当你直接用线程类对象调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,只有start()方法才会启动新的线程。因为run方法是thread里面的一个普通的方法,所以我们直接调用run方法,这个时候它是会运行在我们的主线程中的,因为这个时候我们的程序中只有主线程一个线程,所以如果有两个线程,都是直接调用的run方法,那么他们的执行顺序一定是顺序执行,所以这样并没有做到多线程的这种目的。
下面我们来看一下一段代码及运行结果相信大家会有感触:

public class ThreadRS {
    public static void main(String[] args){
        Thread thread1 = new Thread(new MyRunnable());
        Thread thread2 = new Thread(new MyRunnable());
        //thread1.start();
        //thread2.start();
        thread1.run();
        thread2.run();
    }
}

class MyRunnable implements Runnable {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                System.out.println(i);
                Thread.sleep(100);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述
在这里插入图片描述
下面我们来看一下run方法的源码:

@Override
public void run() {
    if (target != null) {//这里的Target就是Runable的对象
        target.run();
    }
}

通过对象调用方法那不得整个方法执行执行完了再往下走。
下面看看Start的源码:

public synchronized void start() {   
    //如果这里不为0的话就抛异常
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

    //把当前线程加入到线程组中
    //private ThreadGroup group
    group.add(this);

    //初始化标记位未启动
    boolean started = false;
    try {
        start0();
        //标识为启动状态
        started = true;
    } finally {
        try {
            //如果没开启,标识为启动失败
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值