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并发编程的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程实战 04死锁了怎么办?

Java编程思想之二十 并发

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

Java编程思想-并发

Java并发编程实战—–synchronized

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段