文档章节

java 并行基础

MarcoWu
 MarcoWu
发布于 2015/12/23 16:28
字数 1237
阅读 12
收藏 0

1.线程和进程

  • 进程是计算机程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在当代线程设计的计算机结构中,进程是线程的容器。

  • 线程是轻量级进程,是程序执行的最小单位。

2.线程的基本操作

  • 新建线程

    Method1: 通过继承Thread类,重写run()。

    Thread t1 = new Thread(){
        @Override    public void run() {
            System.out.println("This is:"+getName());
        }};t1.start();

     

    Method2: By impletments Runnable interface to create a new thread.

    public class Main implements Runnable{
    
        public static void main(String[] args) {
            Thread t2 = new Thread(new Main());
            t2.start();
            System.out.println("This is:" + Thread.currentThread().getName());
        }
    
        @Override    public void run() {
            System.out.println("This is:" + Thread.currentThread().getName());
        }}

    ⚠️ run() can't start a thread.

  • 终止线程

    stop(): 暴力的终止线程,并且会立即释放这个线程所持有的锁,而这些锁恰恰是用来维持对象一致性的。
    使用这个方法时,需要控制好临界区对象的安全。

    Thread.currentThread().stop();
  • 线程中断

    线程中断是一种重要的线程协作机制。

    public void Thread.interrupt()  //中断线程
    public bealoon Thread.isInterrupted()   //判断是都被中断
    public static boolean Thread.interrupted()  //判断是否被中断,并清除当前中断状态
    public static native void sleep(long millis) throws InterruptedException

    ⚠️ 当线程在sleep休眠时,如果被中断,这个异常就会产生。

    /*Demon*/public class Main implements Runnable{
        public static void main(String[] args) {
            Thread t2 = new Thread(new Main());
            t2.start();
            t2.interrupt();
        }
        @Override    public void run() {
            try {
                Thread.sleep(2000);
                System.out.println("run");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }j}

    线程中断并不会使线程立刻退出,而是给线程发送一个通知,告知目标线程,有人希望你退出啦!至于目标线程接到通知后如何处理,则完全由目标程序自行决定。

  • 等待(wait)和通知(notify)

    wait() 一旦调用了该方法,当前线程就会进入等待,它会进入等待队列中,而notify()则是可以从这个等待队列中随机唤醒一个线程,这种选择是不公平的。

    除了notify()方法外,还有一个notifyAll(),它会唤醒在这个等待队列中所有等待的线程。

    ⚠️Object.wait()不可以随便调用的,它必须被包含在队应的synchronzied语句中,无论是wait()还是notify()都需要获得目标对象的一个监视器。

    sleep()和wait()的区别:除了wait()可以被唤醒外,另外一个主要区别就是wait()方法会释放目标对象的锁,而Thread.sleep()方法不会释放任何资源。

  • 挂起(suspend)和继续执行(resume)

    ⚠️这两个方法已经被标记被弃用
    不推荐使用的原因是因为suspend()在倒置线程暂停的同时,并不会去释放任何锁资源。此时,其它线程想要访问被它暂用的锁时,都会被牵连,导致无法正常继续运行。

  • 等待线程结束(join)和谦让(yield)

    public final void join() throws InterruptedExceptionpublic 
    final synchronized void join(long mills) throws InterruptedException

     

    第一个join()方法表示无限等待,它会一直阻塞当前线程,直到目标线程执行完毕。
    第二个给出了一个最大等待时间,如果超过了给定时间目标线程还在执行,当前线程也会因为“等不及”了而继续往下执行。

    public static native void yield();

     

    这个方法一旦执行,它会使当前线程让出cpu。在让出cpu之后,还会进行cpu资源的抢夺。

3.volatile

volatile Object object = new Object();

当使用volatile声明一个变量时,就等于告诉虚拟机,这个变量极有可能会被某些程序活着线程修改,为了确保这个变量被修改后,应用程序范围内所有线程都能够“看到”这个改动,虚拟机就必须采用一些特殊的手段,保证这个变量的可见性。

4.ThreadGroup

ThreadGroup tg = new ThreadGroup("GroupName");
Thread t1 = new Thread(tg, new RunnableIml(), "T1");
……

5.守护线程(Daemon)

作用通常是在后台静默完成一些系统性的服务。
设置守护线程必须在线程start()之前设置。

Thread.setDeamon(true);

6. 线程优先级

在java中,使用1到10表示线程的优先级。一般可以使用内置的三个静态标量表示:MINPRIORITY(1);NORMPRIORITY(5);MAX_PRIORITY(10),数字越大表示优先级越高。

Thread.setPriority(Thread.MAX_PRIORITY);

7.线程安全

synchronized的用法:
* 指定加锁对象:给对象枷锁,进入同步代码前要获得给定对象的锁。
* 直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
* 直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。

🍏jps 可以显示当前系统中所有的java进程,jstack可以打印java进程内部线程及其堆栈。

MacBook-Pro:~ marco$ jps1018 QBootLoader991 1055 Launcher646 966 RemoteMavenServer1077 Jps
MacBook-Pro:~ marco$ jstack 966...


© 著作权归作者所有

MarcoWu
粉丝 0
博文 2
码字总数 2071
作品 0
徐汇
程序员
私信 提问
9个杀手级 JVM 编程语言

Java虚拟机已经不再是仅仅局限在 Java 了,很多语言提供了脚本转换,可以让其他的程序在java虚拟机上运行,这样能够让更多的开发者能够依靠JVM在Java平台上大有作为。而且虚拟机以及 对应的字...

junwong
2012/03/23
27.7K
12
Java 11 究竟比 8 快了多少?看看这个基准测试

开源规划调度引擎 OptaPlanner 官网发布了一个 Java 11 GC 性能基准测试报告。 当前使用量最大的 Java 版本是 8,所以测试者用 Java 8 与 Java 11 进行对比测试。GC 是影响 Java 性能的关键因...

h4cd
01/18
16.4K
35
9个杀手级 JVM 编程语言

Java虚拟机已经不再是仅仅局限在 Java 了,很多语言提供了脚本转换,可以让其他的程序在java虚拟机上运行,这样能够让更多的开发者能够依靠JVM在Java平台上大有作为。而且虚拟机以及 对应的字...

彭博
2012/11/27
987
0
读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
695
1
002_JVM内存结构及调优学习

常遇到关于内存溢出的错误 java.lang包下 StackOverflowError 很少 OutOfMemoryError: heap space(堆空间) 比较常见 OutOfMemoryError: PermGen space 经常出现 2. Java虚拟机结构和属性...

英年求肥
2014/11/11
142
0

没有更多内容

加载失败,请刷新页面

加载更多

js中将字符串转换成json的三种方式

使用ajax的开发项目过程中,经常需要将json格式的字符串返回到前端,前端解析成js对象(JSON )。 ECMA-262(E3) 中没有将JSON概念写到标准中,还好在 ECMA-262(E5) 中JSON的概念被正式引入了...

物种起源-达尔文
28分钟前
6
0
centos7下面python3.7安装

我这里使用的是CentOS7,默认系统自带python2.7的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的...

chenhongjiang
34分钟前
5
0
带你入门SpringCloud统一配置 | SpringCloud Config

前言 在微服务中众多服务的配置必然会出现相同的配置,如果配置发生变化需要修改,一个个去修改然后重启项目的方案是绝对不可取的。而 SpringCloud Config 就是一个可以帮助你实现统一配置选...

桌前明月
34分钟前
6
0
9.21 日常记录

先说说最近的状态: 一句话,很不好。缺失了目标感,做什么事都是浑浑噩噩的。 每天都是想着轻松的活路去做复习,没有看书,根本没有去思考如何让自己变得更好。 回想起年初的约定,也是一个...

Garphy
43分钟前
6
0
借助Python 函数进行模块化代码

你是否对函数、类、方法、库和模块等花哨的编程术语感到困惑?你是否在与变量作用域斗争?无论你是自学成才的还是经过正式培训的程序员,代码的模块化都会令人困惑。但是类和库鼓励模块化代码...

问题终结者
47分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部