并发编程(一)--- 基础

什么是并发编程?

  并发编程就是一个程序运行时(进程)有多个线程在运行,它出现的原因就是为了提高程序的运行性能。其应用场景就是对于一个任务可以拆分为多个并行的方向去运行。举个例子:车站卖票时一般都是多个窗口通过程序同时在卖票,这其实就是一种并发编程最常见的场景。虽然这种"并发"卖票的方式提高了卖票的效率,但是由此而来的几个问题也随之而来。一趟列车车票总数是一定的,多个窗口通过应用程序卖票时要保证一张票只能被一个窗口卖,另外需要保证的是所卖出的票的总数不能超过一个值,这些问题都是在程序中需要考虑的。

并发编程的一些基本概念

进程与线程:

  这里推荐一下阮一峰老师的一篇文章:进程与线程的一个简单解释

并发与并行

  现代的计算机基本都是多核计算机,即有多个CPU。这就代表了计算机在同一时刻可以运行多个程序,这被称为并行模式。而在单核计算机时代,计算机同一时刻只能运行一个程序,但是当程序运行到需要做IO操作的时候,此时CPU是处于一个等待状态,这就是一种浪费,为了在程序执行长时间的IO操作或其他阻塞操作时又可以利用CPU,计算机科学家把CPU的运行做了一个分时处理,即CPU的运行是由n个CPU运行的单位时间组成的,它在一个时间段内可以运行多个程序,因为在程序运行到执行IO操作时,可以把CPU的执行时间片分配给其他程序。这样子从宏观看,CPU好像在运行多个程序,这样一种模式即并发模式

Java中创建线程的四种方式

继承Thread类

public class ThreadDemo extends Thread {
	//重写run方法
    @Override
	public void run(){
        ...
    }
}
public class Test{
    public static void main(String[] args){
        ThreadDemo threadDemo = new ThreadDemo();
        threadDemo.start();
    }
}

实现Runable接口

public class ThreadDemo implements Runable{

    @Override
    public void run(){
        ...
    }

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

利用Callable和FutureTask
这种方式可以获取线程的执行结果

public class ThreadDemo implements Callable<V>{
    @Override
    public V call() throws Exception{
        ...
    }
}

public class Test{
    public static void main(String[] args) {
        FutureTask<Object> task = new FutureTask<>(new ThreadDemo());
        Thread thread = new ThreadDemo(task);
        thread.start();
        //获取线程执行结果
        Object result = task.get();
    }
}

利用线程池技术
这个后面单独一篇博客讲解

Java中线程的六种状态

图片来源《Java并发编程的艺术》
新建态:当一个线程被创建完毕但是并未调用其start方法时,它就处于新建态,此时它并不会被分配CPU的运行时间片。

运行态:当调用了线程的start方法,线程就处于运行态。Java中线程的运行态其实还可以分为就绪态和运行中。所谓的就绪态就是线程并未被分配CPU运行时间片,处于一个等待分配的状态,而运行中是指线程被分配了CPU运行时间片,正在运行。当调用的线程Thread类的**public static void yield()**方法的时候,其实线程就是从运行中变为就绪态,线程让出CPU。

等待状态:它描述的是线程处于暂停的状态,它是一种无限期等待,也就是说它如果想继续运行必须得等其他线程唤醒它才可以。通过调用wait()、join()、park()方法可以让线程进入等待状态,而通过调用noitify()、notifyAll()、unpark()等方法可以唤醒线程,这些方法详细使用另外的文章会介绍。

超时等待:它与上面的等待状态的区别是它在一定时间内没有被唤醒它会自动从超时等待状态进入运行态。

阻塞态:它是指线程去执行被synchronized修饰的方法或代码块时无法获取synchronized锁而被阻塞的一种状态,直到线程获取到锁才进入运行态。

终止:终止状态是指线程执行完毕。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章