Hi!欢迎光临陕西省的权威思科、华为、Oracle、红帽、深信服、微软认证培训中心!
| 029-88235527
您现在所在位置:首页 > 新闻资讯 > 行业新闻 >

Java编程中的并行基础干货!

发布日期:2020-08-15 15:22:47点击次数:

分享到:
Java编程中的并行基础
原子性,可见性,有序性
原子性指的是一个操作是不可中断的,要么成功要么失败,不会被其他线程所干扰;比如 int=1 ,这一操作在 cpu 中分为好几个指令,但对程序而言这几个指令是一体的,只有可能执行成功或者失败,不可能发生只执行了一半的操作;对不同 CPU 而言保证原子性的的实现方式各有不同,就英特尔 CPU 而言是使用一个 lock 指令来保证的。
可见性指某一线程改变某一共享变量,其他线程未必会马上知道。
有序性指对一个操作而言指令是按一定顺序执行的,但编译器为了提高程序执行的速度,会重排程序指令;cpu在执行指令的时候采用的是流水线的形式,上一个指令和下一个指令差一个工步。比如A指令分三个工步:
操作内存a;
操作内存b;
操作内存c;
现假设有个指令 B 操作流程和 A 一样,那么先执行指令 A 再执行指令 B 时间全利用上了,中间没有停顿等待;但如果有三个这样的指令在流水线上执行:a>b>c ,b>e>c ,c>e>a ;这样的指令顺序就会发生等待降低了 CPU 的效率,编译器为了避免这种事情发生,会适当优化指令的顺序进行重排。
volatile关键字
volatile 关键字在 Java 中的作用是保证变量的可见性和防止指令重排。
线程的相关操作
创建线程有三种方法
继承Thread类创建线程
实现Runnable接口创建线程
使用Callable和Future创建线程
终止线程的方法
终止线程可调用 stop() 方法,但这个方法是被废弃不建议使用的,因为强制终止一个线程会引起数据的不一致问题。比如一个线程数据写到一半被终止了,释放了锁,其他线程拿到锁继续写数据,结果导致数据发生了错误。终止线程比较好的方法是“让程序自己终止”,比如定义一个标识符,当标识符为 true 的时候直让程序走到终点,这样就能达到“自己终止”的目的。
线程的中断等待和通知
interrupt() 方法可以中断当前程序,object.wait() 方法让线程进入等待队列,object.notify() 随机唤醒等待队列的一个线程, object.notifyAll() 唤醒等待队列的所有线程。object.wait() 必须在 synchronzied  语句中调用;执行wait、notify 方法必须获得对象的监视器,执行结束后释放监视器供其他线程获取。
join
join() 方法功能是等待其他线程“加入”,可以理解为将某个线程并为自己的子线程,等子线程走完或者等子线程走规定的时间,主线程才往下走;join 的本质是调用调用线程对象的 wait 方法,当我们执行 wait 或者 notify 方法不应该获取线程对象的监听器,因为可能会影响到其他线程的 join。
yield
yield 是线程的“谦让”机制,可以理解为当线程抢到 cpu 资源时,放弃这次资源重新抢占,yield() 是 Thread 里的一个静态方法。
线程组
如果一个多线程系统线程数量众多而且分工明确,那么可以使用线程组来分类。
public void contextLoads() {
    ThreadGroup testGroup=new ThreadGroup("testGroup");
    Thread a = new Thread(testGroup, new MyRunnable(), "a");
    Thread b = new Thread(testGroup, new MyRunnable(), "b");
    a.start();
    b.start();
    int i = testGroup.activeCount();
}
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("test");
    }
}
图示代码创建了一个 testGroup 线程组。
守护线程
守护线程是一种特殊线程,它类似 Java 中的异常系统,主要是概念上的分类,与之对应的是用户线程。它功能应该是在后台完成一些系统性的服务;设置一个线程为守护线程应该在线程 start 之前 setDaemon()。
线程优先级
Java 中线程可以有自己的优先级,优先级高的更有优势抢占资源;线程优先级高的不一定能抢占到资源,只是一个概率问题,而对应优先级低的线程可能会发生饥饿。
在 Java 中使用1到10表示线程的优先级,使用setPriority()方法来进行设置,数字越大代表优先级越高。

想了解更多IT软件学习方面的内容,欢迎到西安鸥鹏IT教育进行咨询,是专业的IT项目管理、项目开发、IT人力资源顾问公司。OPENLAB为几乎所有相关知名IT企业CISCO,MICROSOFT,REDHAT,华为,ORACLE的授权培训机构,同时是PROMETRIC和VUE授权的相关考试中心,可以组织学员参加认证考试并获得IT资格认证。为您提供最好的优质服务。