Java并发编程
Posted fankongkong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发编程相关的知识,希望对你有一定的参考价值。
1、定义
线程是现代操作系统调用的最小单位,也叫轻量级进程,在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。
2、一个普通的java程序中包含哪些线程
下面是在jdk1.8.0_60环境下的代码输出。
1 import java.lang.management.ManagementFactory; 2 import java.lang.management.ThreadInfo; 3 import java.lang.management.ThreadMXBean; 4 5 public class MultiThread { 6 public static void main(String[] args) { 7 // 获取java线程管理MXBean 8 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); 9 ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false); 10 // 遍历线程信息,仅打印线程ID和线程名称信息 11 for (ThreadInfo threadInfo : threadInfos) { 12 System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName()); 13 } 14 System.out.println(System.getProperty("java.version")); 15 } 16 }
输出结果:
[5] Attach Listener //负责接收到外部的命令,对该命令进行执行然后把结果返回给发送者 [4] Signal Dispatcher //分发处理发送给JVM信号的线程 [3] Finalizer //调用对象finalize方法的线程 [2] Reference Handler //清除Reference的线程 [1] main //main线程,用户程序入口 1.8.0_60 //jdk版本号
3、优先级
在Java线程中,通过一个整型成员变量priority来控制优先级,优先级的范围从1-10,在线程构建的时候可以通过setPriority(int)方法来修改优先级,默认优先级是5,优先级高的线程分配时间片的数量要多余优先级低的线程。在不同的JVM以及操作系统上,线程规划会存在差异,有些操作系统甚至会忽略线程优先级的设定。
4、优先级例子
我的电脑是win7,64,jdk1.8,输出结果表明优先级生效了。
1 package thread; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.concurrent.TimeUnit; 6 7 public class Priority { 8 private static volatile boolean notStart = true; 9 private static volatile boolean notEnd = true; 10 11 static class Job implements Runnable{ 12 private int priority; 13 private long jobCount; 14 public Job(int priority){ 15 this.priority = priority; 16 } 17 @Override 18 public void run() { 19 while(notStart){ 20 Thread.yield(); 21 } 22 while(notEnd){ 23 Thread.yield(); 24 jobCount++; 25 } 26 } 27 } 28 public static void main(String[] args) throws InterruptedException { 29 List<Job> jobs = new ArrayList<Job>(); 30 for(int i = 0; i < 10; i++){ 31 //设置优先级 32 int priority = i < 5 ? Thread.MIN_PRIORITY:Thread.MAX_PRIORITY; 33 Job job = new Job(priority); 34 jobs.add(job); 35 Thread thread = new Thread(job,"Thread:" + i); 36 thread.setPriority(priority); 37 thread.start(); 38 } 39 notStart = false; 40 TimeUnit.SECONDS.sleep(2); 41 notEnd = false; 42 for(Job job : jobs){ 43 System.out.println("Job Priority : " + job.priority 44 + ", Count : " + job.jobCount); 45 } 46 } 47 }
输出结果
1 Job Priority : 1, Count : 6607305 2 Job Priority : 1, Count : 3393520 3 Job Priority : 1, Count : 11684488 4 Job Priority : 1, Count : 8878447 5 Job Priority : 1, Count : 6607130 6 Job Priority : 10, Count : 12661281 7 Job Priority : 10, Count : 12467001 8 Job Priority : 10, Count : 12306292 9 Job Priority : 10, Count : 12425011 10 Job Priority : 10, Count : 12817522
5、线程的状态
java线程在运行的生命周期中可能处于一下6种不同的状态,某一刻只能是其中的一个状态。
NEW:初始状态,线程被构建,但是还没有调用start()方法;
RUNNABLE:运行状态,java线程将操作系统中的就绪和运行两种状态笼统地称作“运行中”;
BLOCKED:阻塞状态,表示线程阻塞于锁;
WAITING:等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断);
TIME_WATING:超时等待状态,该状态不同于WAITING,它是可以在指定的时间自行返回的;
TERMINATED:终止状态,表示当前线程已经执行完毕。
6、启动和终止线程
构造线程:一个新构造的线程对象是由其parent线程来进行空间分配的,而child线程继承了parent是否为Daemon(守护线程)、优先级和加载资源的contextClassLoader以及可继承的ThreadLocal,同时还会分配一个唯一的ID来标识这个child线程。
启动线程:调用start()方法,其含义是:当前线程(即parent线程)同步告知Java虚拟机,只要县城规划器空闲,应立即启动调用start()方法的线程。
过期的suspend()、resume()、stop():不建议使用,以suspend方法为例,在调用后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易引起死锁问题。同样,stop方法在终结一个线程时不会保证线程资源正常释放,通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态下。
以上是关于Java并发编程的主要内容,如果未能解决你的问题,请参考以下文章
全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段