并发(concurrency)是指CPU在某个时间段内交替处理多任务的能力。每个CPU不可能只顾着执行某个进程,而让其他进程一直等待被执行。所以,CPU把可执行时间均分成若干份,每个进程执行一份或多份时间后,记录当前的工作状态,释放相关资源并进入等待状态,让其他进程抢占CPU等资源。
在并发环境下,由于程序的封闭性被打破,出现了以下特点:
1.并发程序之间有相互制约的关系。直接制约体现在一个程序需要另一个程序的计算结果;间接制约体现在多个进程竞争共享资源。
2.并发程序的执行过程是断断续续的。程序需要保留现场,记忆现场指令及执行点。
3.当并发数设置合理并且CPU拥有足够的处理能力时,并发会提高程序的运行效率。
在Java编程中,并发主要与线程有关。
线程是CPU调度和分派的基本单位,为了更充分地利用CPU资源,一般都会使用多线程进行处理。多线程的作用是提高任务的平均执行速度,但是会导致程序可解性变差,编程难度加大。所以,合适的线程数才能让CPU资源被充分利用。
每一个线程都有自己的操作栈、程序计数器、局部变量表等资源。同一进程内的所有线程都可以共享该进程的所有资源。
Java提供了两种形式定义线程类:
1.实现Runnable接口并重写其中的run()方法。
1 class Comsumer implements Runnable { 2 3 private Store store; 4 5 public Comsumer(Store store) { 6 this.store = store; 7 } 8 9 @Override 10 public void run() { 11 for (int i = 1; i < 10; i++) { 12 store.getValue(); 13 } 14 } 15 16 }
2.继承Thread类并重写其中的run()方法。
1 class Producer extends Thread { 2 3 private Store store; 4 5 public Producer(Store store) { 6 this.store = store; 7 } 8 9 @Override 10 public void run() { 11 for (int i = 1; i < 10; i++) { 12 store.setValue(i); 13 } 14 } 15 16 }
线程状态的启动需要调用Thread的start()方法:
1.如果是继承Thread类的线程类,则该线程的对象可以直接调用start()方法启动线程。
2.如果是实现Runnable接口的线程类,则该线程的对象需要先包装为一个Thread对象才能调用start()方法启动线程。
1 @Test 2 void test() { 3 Store store = new Store(); 4 Producer producer = new Producer(store); // Producer线程类继承Thread类 5 producer.start(); 6 Comsumer comsumer = new Comsumer(store); // Comsumer线程类实现Runnable接口 7 new Thread(comsumer).start(); 8 }
原文:https://www.cnblogs.com/lqkStudy/p/11135153.html