Java并发:Java并发编程基础

概述:

        Java从生开始就明智地选择了内置线程的支持,使得Java言相比同一期的其他语言具有明优势线程作操作系统调度的最小元,多个线程能时执行,将显著提升程序性能,在多核境中表得更加明。但是,多地线程和对线程的不当管理也容易造成问题

1、 线程简介

      1.1 什么是线程

        现代操作系在运行一个程序,会建一个程。例如,启一个Java程序,操作系统就会建一个Java程。代操作系统调度的最小元是线程,也叫级进程(Light Weight Process),在一个程里可以建多个线程,线程都有各自的数器、堆和局部变量等属性,并且能够访问共享的内存量。理器在线程上高速切使用者感觉到这线程在同时执行。一个Java程序从main()方法开始行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际Java程序天生就是多线程程序,因为执main()方法的是一个名称main线程。下面使用JMX看一个普通的Java程序包含哪些线程,如代4-1所示。

4-1 MultiThread.java

/**
 * @author guanqp
 * @Description  使用JMX来查看一个普通的Java程序包含哪些线程
 * @date 2019/6/29 19:10
 */
public class MultiThread{
    public static void main(String[] args) {
          // 获取Java线程管理MXBean
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
         // 不需要获取同步的monitor和synchronizer信息,仅获取线程和线程堆栈信息
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        // 遍历线程信息,仅打印线程ID和线程名称信息
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.
                    getThreadName());
        }
    }
}

出如下所示(出内容可能不同)。

可以看到,一个Java程序的运行不仅仅main()方法的运行,而是main线程和多个其他线程的同时运行。

1.2 为什么要使用多线程

        执行一个简单“Hello,World!”,却启了那么多的无关线程,是不是把简单问题复杂化了?当然不是,因正确使用多线程,是能够给员带著的好,而使用多线程的原因主要有以下几点。

      (1)更多的理器核心

        随着处理器上的核心数量越来越多,以及超线程技的广泛运用,在大多数算机都比以往更加擅长并行算,而理器性能的提升方式,也从更高的主向更多的核心展。如何利用好处理器上的多个核心也成了在的主要问题

        线程是大多数操作系统调度的基本元,一个程序作一个程来运行,程序运行程中能够创建多个线程,而一个线程在一个刻只能运行在一个理器核心上。想一下,一个单线程程序在运行只能使用一个理器核心,那么再多的理器核心加入也无法著提升 该程序的行效率。相反,如果程序使用多线程技,将逻辑分配到多个理器核心上,就会显著减少程序的时间,并且随着更多理器核心的加入而得更有效率。

    (2)更快的响应时间

       有写一些较为的代里的复不是的算法,而是复业务逻辑),例如,一笔订单建,它包括插入订单数据、生成订单快照、件通知家和记录货品售数量等。用单击订购开始,就要等待些操作全部完成才能看到订购成功的结果。但是么多业务操作,如何能够让其更快地完成呢?

        在上面的场景中,可以使用多线程技,即将数据一致性不的操作派发给其他线处理(也可以使用消息队列),如生成订单快照、件等。这样做的好是响户请求的线程能够尽可能快地理完成,短了响应时间,提升了用

 

   (3)更好的程模型

        Java线程提供了良好、考究并且一致的程模型,使开更加注于问题的解决,即所遇到的问题建立合适的模型,而不是汁地考如何将其多线程化。一旦开发建立好了模型,稍做修改是能方便地映射到Java提供的多线程模型上。

 

1.3 线程优先级

        现代操作系基本采用分的形式度运行的线程,操作系会分出一个个时间片,线程会分配到若干时间片,当线程的时间片用完了就会线度,并等待着下次分配。线程分配到的时间片多少也就决定了线程使用理器源的多少,而线就是决定线程需要多或者少分配一些处理器源的线程属性。

       在Java线程中,通一个整型成员变priority来控制的范1~10,在线程构建的时候可以通setPriority(int)方法来修改,默认优5高的线程分配时间片的数量要多于低的线程。线级时针对频繁阻塞(休眠或者I/O操作)的线程需要,而偏重算(需要CPU时间或者偏运算)的线则设较低的优,确保理器不会被独占。在不同的JVM以及操作系上,线划会存在差异,有些操作系统甚至会忽略对线定,示例如代4-2所示。

4-2 Priority.java:

/**
 * @author guanqp
 * @Description   线程优先级
 * @date 2019/6/29 19:50
 */
public class Priority {
    private static volatile boolean notStart = true;
    private static volatile boolean notEnd = true;
    public static void main(String[] args) throws Exception {
        List<Job> jobs = new ArrayList<Job>();
        for (int i = 0; i < 10; i++) {
            int priority = i < 5 ?Thread.MIN_PRIORITY : Thread.MAX_PRIORITY;
            Job job = new Job(priority);
            jobs.add(job);
            Thread thread = new Thread(job, "Thread:" + i);
            thread.setPriority(priority);
            thread.start();
        }
        notStart = false;
        TimeUnit.SECONDS.sleep(10);
        notEnd = false;
        for (Job job : jobs) {
            System.out.println("Job Priority : " + job.priority + ", Count : " + job.jobCount);
        }
    }
    static class Job implements Runnable {
        private int priority;
        private long jobCount;
        public Job(int priority) {
            this.priority = priority;
        }
        public void run() {
            while (notStart) {
                Thread.yield();
            }
            while (notEnd) {
                Thread.yield();
                jobCount++;
            }
        }
    }
}

运行结果:

Job Priority : 1, Count : 9972123
Job Priority : 1, Count : 9793565
Job Priority : 1, Count : 9999068
Job Priority : 1, Count : 9962941
Job Priority : 1, Count : 10059810
Job Priority : 10, Count : 10081772
Job Priority : 10, Count : 10076200
Job Priority : 10, Count : 10084189
Job Priority : 10, Count : 10009140
Job Priority : 10, Count : 10097671

     从出可以看到线没有生效,110Job数的果非常相近,没有明显差距。表示程序正确性不能依赖线程的高低。

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值