Java7并发编程实战(一) 线程的管理

1:线程的创建

   1:继承Thread类,并且覆盖run()方法

    2:创建一个实现Runnable接口的类。使用带参数的Thread构造器来构造

2:example-->计算打印乘法表

   首先创建一个Calculator类,实现Runnable接口

  

public class Calculator implements Runnable {

    /**
     *  The number
     */
    private int number;

    /**
     *  Constructor of the class
     * @param number : The number
     */
    public Calculator(int number) {
        this.number=number;
    }

    /**
     *  Method that do the calculations
     */
    @Override
    public void run() {
        for (int i=1; i<=10; i++){
            System.out.printf("%s: %d * %d = %d\n",Thread.currentThread().getName(),number,i,i*number);
        }
    }

}

  在Main方法中调用

  

public class Main {

    /**
     * Main method of the example
     * @param args
     */
    public static void main(String[] args) {

        //Launch 10 threads that make the operation with a different number
        for (int i=1; i<=10; i++){
            Calculator calculator=new Calculator(i);
            Thread thread=new Thread(calculator);
            thread.start();
        }
    }
}

打印结果可以看到线程的无序性

  

Thread-1: 2 * 1 = 2
Thread-8: 9 * 1 = 9
Thread-9: 10 * 1 = 10
Thread-9: 10 * 2 = 20
Thread-5: 6 * 1 = 6
Thread-2: 3 * 1 = 3
Thread-3: 4 * 1 = 4
Thread-3: 4 * 2 = 8
Thread-3: 4 * 3 = 12
Thread-3: 4 * 4 = 16
Thread-3: 4 * 5 = 20
Thread-3: 4 * 6 = 24
Thread-3: 4 * 7 = 28
Thread-3: 4 * 8 = 32
Thread-3: 4 * 9 = 36
Thread-3: 4 * 10 = 40
Thread-4: 5 * 1 = 5
Thread-7: 8 * 1 = 8
Thread-7: 8 * 2 = 16
Thread-7: 8 * 3 = 24
Thread-7: 8 * 4 = 32
Thread-7: 8 * 5 = 40
Thread-7: 8 * 6 = 48
Thread-6: 7 * 1 = 7
Thread-6: 7 * 2 = 14
Thread-6: 7 * 3 = 21
Thread-6: 7 * 4 = 28
Thread-6: 7 * 5 = 35
Thread-6: 7 * 6 = 42
Thread-6: 7 * 7 = 49
Thread-6: 7 * 8 = 56
Thread-6: 7 * 9 = 63
Thread-6: 7 * 10 = 70
Thread-0: 1 * 1 = 1
Thread-7: 8 * 7 = 56
Thread-4: 5 * 2 = 10
Thread-4: 5 * 3 = 15
Thread-4: 5 * 4 = 20
Thread-4: 5 * 5 = 25
Thread-4: 5 * 6 = 30
Thread-4: 5 * 7 = 35
Thread-4: 5 * 8 = 40
Thread-4: 5 * 9 = 45
Thread-2: 3 * 2 = 6
Thread-2: 3 * 3 = 9
Thread-5: 6 * 2 = 12
Thread-5: 6 * 3 = 18
Thread-5: 6 * 4 = 24
Thread-9: 10 * 3 = 30
Thread-9: 10 * 4 = 40
Thread-9: 10 * 5 = 50
Thread-9: 10 * 6 = 60
Thread-8: 9 * 2 = 18
Thread-1: 2 * 2 = 4
Thread-1: 2 * 3 = 6
Thread-1: 2 * 4 = 8
Thread-1: 2 * 5 = 10
Thread-1: 2 * 6 = 12
Thread-1: 2 * 7 = 14
Thread-1: 2 * 8 = 16
Thread-1: 2 * 9 = 18
Thread-1: 2 * 10 = 20
Thread-8: 9 * 3 = 27
Thread-8: 9 * 4 = 36
Thread-9: 10 * 7 = 70
Thread-5: 6 * 5 = 30
Thread-5: 6 * 6 = 36
Thread-5: 6 * 7 = 42
Thread-5: 6 * 8 = 48
Thread-5: 6 * 9 = 54
Thread-5: 6 * 10 = 60
Thread-2: 3 * 4 = 12
Thread-2: 3 * 5 = 15
Thread-2: 3 * 6 = 18
Thread-2: 3 * 7 = 21
Thread-2: 3 * 8 = 24
Thread-2: 3 * 9 = 27
Thread-2: 3 * 10 = 30
Thread-4: 5 * 10 = 50
Thread-7: 8 * 8 = 64
Thread-0: 1 * 2 = 2
Thread-0: 1 * 3 = 3
Thread-0: 1 * 4 = 4
Thread-7: 8 * 9 = 72
Thread-9: 10 * 8 = 80
Thread-9: 10 * 9 = 90
Thread-9: 10 * 10 = 100
Thread-8: 9 * 5 = 45
Thread-8: 9 * 6 = 54
Thread-8: 9 * 7 = 63
Thread-8: 9 * 8 = 72
Thread-8: 9 * 9 = 81
Thread-8: 9 * 10 = 90
Thread-7: 8 * 10 = 80
Thread-0: 1 * 5 = 5
Thread-0: 1 * 6 = 6
Thread-0: 1 * 7 = 7
Thread-0: 1 * 8 = 8
Thread-0: 1 * 9 = 9
Thread-0: 1 * 10 = 10
时间: 2024-10-11 04:48:58

Java7并发编程实战(一) 线程的管理的相关文章

【java7并发编程实战】—–线程同步基础:synchronized

在我们的实际应用当中可能经常会遇到这样一个场景:多个线程读或者.写相同的数据,访问相同的文件等等.对于这种情况如果我们不加以控制,是非常容易导致错误的.在java中,为了解决这个问题,引入临界区概念.所谓临界区是指一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问. 在java中为了实现临界区提供了同步机制.当一个线程试图访问一个临界区时,他将使用一种同步机制来查看是不是已经有其他线程进入临界区.如果没有则他就可以进入临界区,否则他就会被同步机制挂起,指定进入的线程离开这个临界区

[笔记][Java7并发编程实战手册]4.3 创建固定的线程执行器newFixedThreadPool线程池

[笔记][Java7并发编程实战手册]系列目录 简介 newFixedThreadPool(int nThreads, ThreadFactory threadFactory) 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程. newCachedThreadPool()创建的线程池的特性是:自动回收不使用的线程(终止并从缓存中移除那些已有 60 秒钟未被使用的线程),(在无可用线程的情况下)自动的为新来的task创

[笔记][Java7并发编程实战手册]第三章-线程同步辅助类-概要

[笔记][Java7并发编程实战手册]系列目录 有点着急了,没有太注重质量,自己也没有理解透,从本章起,读书和随笔笔记的质量会更好. 第三章 在本章中,我们将学习: 资源的并发访问控制 资源的多副本的并发访问控制 等待多个并发事件的完成 在集合点的同步 并发阶段任务的运行 并发阶段任务中的阶段交换 并发任务间的数据交换 回顾 在第二章中主要学习了以下接口 synchronized关键字 Lock接口以及实现类,如ReentrantLock.ReentrantReadWriteLock中的Read

[笔记][Java7并发编程实战手册]3.2 资源的并发访问控制Semaphore信号量

[笔记][Java7并发编程实战手册]系列目录 简介 本文学习信号量Semaphore机制. Semaphore 本质是一个共享锁 内部维护一个可用的信号集,获取信号量之前需要先申请获取信号数量:用完之后,则需要释放信号量:如果不释放,那么其他等待线程则一直阻塞直到获取信号量或则被中断为止 本人的理解是:互斥锁是同一时间只能一个线程访问,而在这里,是同一时间允许获取到了信号量的线程并发访问,而没有获取到信号量的则必须等待信号量的释放: 将信号量初始化为 1,使得它在使用时最多只有一个可用的许可,

[笔记][Java7并发编程实战手册]3.3 资源的多副本并发访问控制Semaphore

[笔记][Java7并发编程实战手册]系列目录 简介 本文继续学习信号量Semaphore机制. 在3.2中其实已经讲解完了,之前对于信号量并发的使用场景不知道,看了本章节才想到一些: 下面就以 租车为列子来讲解并发访问的控制.(示例都很简单或许不符合现实逻辑) 信号量(非二进制信号量)是不保证同步的,需要额外的同步 示例 场景:有一个出租车公司,有三台车,有十个司机,每个司机工作的时间不一致,可以说是司机等待着别人还车后,接着租用汽车. /** * Created by zhuqiang on

[笔记][Java7并发编程实战手册]2.5使用Lock实现同步二

[笔记][Java7并发编程实战手册]系列目录 概要 接上一篇文章,练习修改锁的公平性,和在所中使用条件. 修改锁的公平性ReentrantLock /** *构造一个锁对象,默认为非公平锁 */ public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } 根据ReentrantLock的构造可以看出来,默认会构造非公平锁: 公平锁与非公平锁有什么区别 公平锁 :有多个线程并发访

[笔记][Java7并发编程实战手冊]3.8 并发任务间的数据交换Exchanger

[笔记][Java7并发编程实战手冊]系列文件夹 简单介绍 Exchanger 是一个同步辅助类.用于两个并发线程之间在一个同步点进行数据交换. 同意两个线程在某一个点进行数据交换. 本章exchanger 使用心得总结 两个线程必须使用同一个Exchanger对象,且仅仅能是两个线程间的数据交换 exchanger.exchange(v)的时候,当前线程会被堵塞,直到还有一个线程运行该方法,同一时候完成数据的交换 相似这样的数据交换的,生产者线程一定要先生产数据.再交换数据,消费者线程一定要先

[笔记][Java7并发编程实战手册]4.4 在执行器中执行任务并返回结果Callable、Future

[笔记][Java7并发编程实战手册]系列目录 简介 执行框架(Executor Framework)的优势之一就是,可以在运行并发任务的时候返回结果.但是需要以下两个类来实现功能: 1. 接口 Callable<V> 返回结果并且可能抛出异常的任务.实现者定义了一个不带任何参数的叫做 call 的方法. Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的.但是 Runnable 不会返回结果,并且无法抛出经过检查的异常. Executors 类

[笔记][Java7并发编程实战手册]4.5 运行多个任务并处理第一个结果ThreadPoolExecutor

[笔记][Java7并发编程实战手册]系列目录 简介 看到这个标题的时候,我也很纳闷,因为没有明白所表达的意思. ok,并发编程比较常见的一个问题是:当采用多个并发任务来解决一个问题的时候,往往只需要关心这个任务的第一个结果,例如:验证一个算法的时候,假如一个执行5个算法,那么最先返回结果的,就是最快的. 在本章将会学习,如何使用ThreadPoolExecutor来实现类似场景: 本章ThreadPoolExecutor使用心得 使用 ThreadPoolExecutor.invokeAny(

[笔记][Java7并发编程实战手册]系列目录

Java7并发编程实战手册 这一本实战的书籍.本笔记记录是看了该书.并且简化了书中的示例.的一些随笔记录 我觉得能给我更好的感觉.我觉得先看博客中转载的多线程系列 Java多线程系列-目录源码分析和理论.有时候真的觉得好烦躁.可是,没有这些理论实战中又觉得太多的未知. 所以本人觉得.先粗略的过一遍理论和源码分析.再来看学习实战,在写代码的过程中,去回想和联想理论就能更好的把知识串联起来了: 也可以看到本人在记录这些笔记的时候也会引用到博客中转载的多线程系列文章. [笔记][Java7并发编程实战