Java并行程序基础
来源:互联网 发布:常见的网络促销方式 编辑:程序博客网 时间:2024/05/28 03:01
有关线程
进程是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配的基础单位。进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程的生命周期
线程的所有状态都在Thread的State枚举中
public enum State { /** * 表示刚刚创建的线程,这种线程还没开始执行。 **/ NEW, /** * 调用start()方法后,线程开始执行,处于RUNNABLE状态, * 表示线程所需要的一切资源以及准备好。 **/ RUNNABLE, /** * 当线程遇到synchronized同步块,就进入了BLOCKED阻塞状态。 * 这时线程会暂停执行,直到获得请求的锁。 **/ BLOCKED, /** * WAITING和TIMED_WAITING都表示等待状态,他们是区别是WAITING表示进入一个无时间限制的等待 * TIMED_WAITING会进入一个有时间限制的等待。 * WAITING的状态正是在等待特殊的事件,如notify()方法。而通过join()方法等待的线程,则是等待目标线程的终止。 * 一旦等到期望的时间,线程就会继续执行,进入RUNNABLE状态。 * 当线程执行完后进入TERMINATED状态,表示线程执行结束。 **/ WAITING, TIMED_WAITING, TERMINATED;
线程的基本操作
新建线程
新建线程很简单,使用new创建一个线程对象,并将它start()。
Thread t1 = new Thread();t1.start();
start()方法会创建一个新线程,并执行run()方法。
注意:不要使用run()来开启线程。它只会在当前线程中,串行执行run()方法。
让线程执行指定逻辑,需要重载Thread的run()方法。
Thread t1 =new Thread(){@Overridepublic void run(){ ...}};t1.start();
也可以使用Runnable接口来实现相同操作。
public class A implements Runnable{@Overridepublic void run(){....}}#把Runnable的实例作为参数传入线程Thread t1 = new Thread(new A());t1.start();
终止线程
废弃的方法:stop()。
此方法太粗暴,会直接终止线程,并且立即释放线程持有的锁,破坏数据的一致性。
线程中断
线程中断并不会使线程立即退出,而是给线程发一个通知,告诉目标线程停止执行,至于目标线程接到通知后怎么处理,由线程自行决定。
线程中断相关的3个方法:
//Thread.interrupt() 是一个实例方法,他通知目标线程中断,也就是设置中断标志位。中断标志位表示当前线程已经被中断了。public void Thread.interrupt() ;//Thread.isInterrupted() 也是实例方法,他判断当前线程是否被中断(通过检查中断标志位) public boolean Thread.isInterrupted(); //Thread.interrupted() 是静态方法,判断当前线程的中断状态,但同时会清除当前线程的中断标志位状态。public static boolean Thread.interrupted() ;
示例1:
public class InterruptExample { public static void main(String [] a){ Thread t1 = new Thread("线程小哥 - 1 "){ @Override public void run() { while (true){ /** * 必须得判断是否接受到中断通知,如果不写退出方法,也无法将当前线程退出. */ if (Thread.currentThread().isInterrupted()){ System.out.println(Thread.currentThread().getName() + " Interrupted ... "); break; } Thread.yield(); } } }; t1.start(); try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } /** * 给目标线程发送中断通知 * 目标线程中必须有处理中断通知的代码 * 否则,就算发送了通知,目标线程也无法停止. */ t1.interrupt(); }}
示例2:
public class InterruptExample { public static void main(String [] a){ Thread t1 = new Thread("线程小哥 - 1 "){ @Override public void run() { while (true){ /** * 必须得判断是否接受到中断通知,如果不写退出方法,也无法将当前线程退出. */ if (Thread.currentThread().isInterrupted()){ System.out.println(Thread.currentThread().getName() + " Interrupted ... "); break; } try { /** * 处理业务逻辑花费10秒. * 而在这时,主线程发送了中断通知,当线程在sleep的时候如果收到中断 * 则会抛出InterruptedException,如果在异常中不处理,则线程不会中断. * */ Thread.sleep(10000); } catch (InterruptedException e) { System.out.println("我错了...."); /** * 在sleep过程中,收到中断通知,抛出异常.可以直接退出线程. * 但如果还需要处理其他业务,则需要重新中断自己.设置中断标记位. * 这样在下次循环的时候 线程发现中断通知,才能正确的退出. */ Thread.currentThread().interrupt(); } Thread.yield(); } } }; t1.start(); try { /** * 处理业务500毫秒 * 然后发送中断通知,此时t1线程还在sleep中. */ Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } /** * 给目标线程发送中断通知 * 目标线程中必须有处理中断通知的代码 * 否则,就算发送了通知,目标线程也无法停止. */ t1.interrupt(); }}
注意:
Thread.sleep()方法由于中断而抛出异常,此时,它会清除中断标志,如果不加处理,则捕获不到这个中断,故在异常处理中,再此设置中断标志。
等待(wait)和通知(notify)
阅读全文
0 0
- Java并行程序基础
- Java并行程序基础
- java并行程序基础
- Java 并行程序基础
- Java并行程序基础总结
- 第二章 Java并行程序基础
- 《Java高并发程序设计》总结--2.Java并行程序基础
- java高并发程序设计总结二:java并行程序基础
- Java高并发程序设计笔记2之并行程序基础
- Java高并发设计——并行程序基础一
- Java高并发设计——并行程序基础二
- (二)Java 并行程序
- 实战Java高并发程序设计(二)Java并行程序基础
- java基础——串行与并行
- 【Java高并发学习】并行基础概念
- 自动检测并行 Java 程序中的错误
- 关于java并行程序开发重点
- 如何提高Java并行程序性能
- 魔法物品——动态规划
- arcgis之shapefile转grid
- An introduction to Generative Adversarial Networks (with code in TensorFlow)
- EditText 回车设置/imeOptions无效
- mongodb的常用指令
- Java并行程序基础
- 《Spring Web Flow 实践》
- 发送有序和无序广播
- C注释转换为C++注释
- 网关
- Spring transaction事务 roll back各种回滚
- QT笔记
- 项目review--2017.05.27
- 约瑟夫环问题(一)(难度:1颗星)