博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发知识(1)——线程基础知识
阅读量:5082 次
发布时间:2019-06-13

本文共 2745 字,大约阅读时间需要 9 分钟。

创建线程有几种方式:

  1. 自定义类继承Thread(如下面的AThread),然后使用Thread.start方法启动线程
  2. 创建类,实现Runnable,通过Thread的构造函数来启动,有时也用于ThreadPoolExecutor线程池的一些execute方法中
  3. Callable,提到Callable就需要知道Future,通常情况下Callable用于线程池execute或submit方法中,获取线程的返回结果。
    FutureTask
  4. Executors框架的几个常用方法,调用execute或者submit方法即可。
public class CreateThread {    @Test    public void useThread() throws InterruptedException {        AThread newThread = new AThread("线程1");        newThread.start();    }    @Test    public void implementsRunnable() {        new Thread(()->{            System.err.println(Thread.currentThread().getName() + " is running.");        }, "线程2").start();    }    @Test    public void useCallable() throws ExecutionException, InterruptedException {        Callable
callable = new Callable
() { @Override public String call() throws Exception { return "use callable test."; } }; ExecutorService executorService = Executors.newFixedThreadPool(1); Future
future = executorService.submit(callable); System.err.println(future.get()); } class AThread extends Thread { public AThread(String name) { super(name); } @Override public void run() { System.err.println(Thread.currentThread().getName() + " is running."); } }}

Race Condition

知识前提:了解一下《深入理解JVM虚拟机》Chapter2.2,Java虚拟机运行时数据区。

方法区(类变量、类信息等)、堆(heap)是线程共享的数据区;

虚拟机栈、本地方法栈、程序计数器(唯一一个不会OOM的区域)线程隔离。

这里以i++为例

首先介绍一下:

public class Test {     int test1() {        int i = 1;        return i++;    }    int test2() {        int i = 1;       return  ++i;    }}

javac 编译成字节码文件,javap -verbose Test.class查看字节码信息:

int test1();    descriptor: ()I    flags:    Code:      stack=1, locals=2, args_size=1         0: iconst_1         1: istore_1         2: iload_1         3: iinc          1, 1         6: ireturn      LineNumberTable:        line 15: 0        line 16: 2  int test2();    descriptor: ()I    flags:    Code:      stack=1, locals=2, args_size=1         0: iconst_1         1: istore_1         2: iinc          1, 1         5: iload_1         6: ireturn      LineNumberTable:        line 19: 0        line 20: 2

i++分为三步:iconst_1——数字1进栈,istore_1——将栈顶int型数值存入第二个局部变量,从0开始计数

iinc 1: 加1

注意到:i++是先load,再inc;而++i是先inc再load

线程的几种状态

参考《深入理解Java虚拟机》chapter12,线程状态分为5种:

  • 新建(New):创建后未运行的线程
  • 运行(Runnable):Runnable包含了操作系统线程状态中的Running和Ready,有可能正在执行,也有可能等待着CPU为它分配执行时间。
  • 无限期等待(Waiting):无等待时间的Object.wait()方法,Thread.join()方法,LockSupport.park()方法。
  • 限期等待(Timed Waiting):Thread.sleep(),带timeout参数的wait(),join()方法,LockSupport.parkNanos(),LockSupport.parkUntil();
  • 阻塞(Blocked):等待获取一个排它锁。
  • 结束(Terminated):已终止线程的线程状态。

各状态之间的转换如下图(来自:):

1

转载于:https://www.cnblogs.com/studentytj/p/11182766.html

你可能感兴趣的文章
使用Python读取和写入mp3文件的id3v1信息
查看>>
内存空间切换:在内核写数据到用户空间的方法
查看>>
【POJ3233】Matrix Power Series
查看>>
音视频基础知识(一)
查看>>
BZOJ2982: combination Lucas
查看>>
OpenCV下的图片旋转(转)
查看>>
WPF 一个弧形手势提示动画
查看>>
随手练——回文串专题
查看>>
线段树详解 (原理,实现与应用)
查看>>
Ubuntu 登陆异常-输入正确的密码后还会返回到登陆界面的问题
查看>>
JQ轮播小demo
查看>>
【原创】大叔问题定位分享(20)hdfs文件create写入正常,append写入报错
查看>>
2016 西班牙 国家德比(西甲31轮)
查看>>
CArichive每次读写一行
查看>>
让QT支持中文的方法
查看>>
dos批处理知识
查看>>
多文档界面的实现(DotNetBar的superTabControl)
查看>>
3.字符串
查看>>
关于深复制与浅复制
查看>>
js 重写a标签的href属性和onclick事件
查看>>