并发编程基础

学习并发的过程。

高并发编程中线程是基础,学习线程前先得了解线程和进程的区别。
进程独立拥有自己的资源,而同一个进程中不同线程时公用资源的。
进程间通信要比线程间通信要麻烦的多,而且线程切换也要比进程间快。

然后需要了解线程的生命周期
周期如下图并发编程基础


(图片为网上找来的)
首先是 创建线程 ,实例化线程有三种方式 :
第一种方式是继承thread类。
代码如下:
public class ThreadTest extends Thread{
//写内容
}

点进去看源码后发现Thread类是通过实现runnable接口来实现多线程的,我个人觉得最好还是不用,毕竟实现接口可以多实现,而继承类只能单继承。
并发编程基础
Thread类提供了几个方法:
1 sleep方法
public static native void sleep(long millis) throws InterruptedException{
}
native关键查了下 用来修饰用于调用非java语言的方法的,比如一个方法要调用c,那就得用native修饰(不能与abstract修饰符合用)
这个方法官方注释中有一行描述,The thread does not lose ownership of any monitors.意思就是说sleep的时候,不释放锁,也就是”占着茅坑不拉屎“,与之相对的就是wait方法,wait是在等待的时候释放锁的。(笔面试有时会问 sleep wait区别)
2 yeild 方法让线程回到可执行状态,由于没用过就不多说了。

第二种方式是实现runnable接口,这是使用的相对比较多的。
实现代码如下:
class RunnableTest implements Runnable{

@Override
public void run() {
// 代码

}
}
代码写在run方法

第三种是实现callable接口,相较于实现runnable接口,好处就是返回值。
实现代码如下
class callableTest<V> implements Callable<V>{

@Override
public V call() throws Exception {
// 代码
return “我是返回值,我在这里”;
}
}
runnable callable区别:Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
*(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
*(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。

然后就可以通过start方法就可以通过进入运行中的状态了。