多线程

java.util.concurrent 多线程框架---线程池编程(四)

被刻印的时光 ゝ 提交于 2020-03-13 01:57:20
java.util.concurrent 结构 Sync : 获得 / 释放 (acquire/release) 协议。同步(定制锁、资源管理、其他同步) Channel : 放置 / 取走 (put/take) 协议。通信( 缓冲 和 队列 服务) Executor : 执行 Runnable 任务。线程池执行器(线程池的实现一些实现了Executor接口的) Sync -- acquire/release 协议的主要接口 - 用来定制锁,资源管理,其他的同步用途 - 高层抽象接口 - 没有区分不同的加锁用法 -- 实现 - Mutex, ReentrantLock, Latch, CountDown,Semaphore, WaiterPreferenceSemaphore, FIFOSemaphore, PrioritySemaphore n 还有,有几个简单的实现,例如 ObservableSync, LayeredSync 独占锁 try { lock.acquire(); try { action(); } finally { lock.release(); } } catch (InterruptedException ie) { ... } -- Java 同步块不适用的时候使用它 - 超时,回退 (back-off) - 确保可中断 - 大量迅速锁定 - 创建

学习笔记1:java多线程机制之线程概念

筅森魡賤 提交于 2020-03-13 00:39:38
由于种种需求,今天开始由浅入深的学习java的多线程机制,而java语言的一大特性点就是内置对多线程的支持。 以下内容出自: http://blog.csdn.net/jiangwei0910410003/article/details/19962627 : 线程的生命周期: 1.新建状态(New):用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存 2.就绪状态(Runnable):当一个线程创建了以后,其他的线程调用了它的start()方法,该线程就进入了就绪状态。处于这个状态的 线程位于可运行池中,等待获得CPU的使用权 3.运行状态(Running): 处于这个状态的线程占用CPU,执行程序的代码 4.阻塞状态(Blocked): 当线程处于阻塞状态时,java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到 运行状态。 阻塞状态分为三种情况: 1)、 位于对象等待池中的阻塞状态:当线程运行时,如果执行了某个对象的wait()方法,java虚拟机就回把线程放到这个对象的等待池中 2)、 位于对象锁中的阻塞状态,当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他的线程占用,JVM就会把这个线程放到这个对象的琐池中。 3)、 其它的阻塞状态:当前线程执行了sleep()方法

多线程之线程间通信

久未见 提交于 2020-03-12 18:42:54
1、案例 class NumberHolder { private int number; public synchronized void increase() { if (0 != number) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 能执行到这里说明已经被唤醒 // 并且number为0 number++; System.out.print(number+"-"); // 通知在等待的线程 notify(); } public synchronized void decrease() { if (0 == number) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 能执行到这里说明已经被唤醒 // 并且number不为0 number--; System.out.print(number+"-"); notify(); } } class IncreaseThread extends Thread { private NumberHolder numberHolder; public IncreaseThread(NumberHolder

Linux常用多线程函数

巧了我就是萌 提交于 2020-03-12 11:29:55
Linux多线程函数用得比较多的是下面的3个 pthread_create(),pthread_exit(),pthread_join();它们都是在头文件之中。编译时需要加静态库-lpthread 下面是函数的说明:   pthread_create是UNIX环境创建线程函数 int pthread_create( pthread_t *restrict tidp, const pthread_attr_t *restrict_attr, void*(*start_rtn)(void*), void *restrict arg); 返回值   若成功则返回0,否则返回出错编号   返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函 数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把 这个结构的地址作为arg的参数传入。   linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。   由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict

多线程

纵饮孤独 提交于 2020-03-12 05:21:33
多线程 进程 程序执行过程中具有动态性;持有资源和线程,是系统进行资源分配和调度的基本单位 线程 线程的分类 主线程:JVM调用程序mian()所产生的线程。 当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。 后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。 前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。 有时被称为轻量级进程,是程序执行中的最小单元 互斥与交互 线程实现方法 继承Thread类,重写该类的run()方法; 通过实现Runnable接口来创建线程,并重写该线程的run()方法 创建实现Callable和Future创建线程,实现call()方法 创建线程方法的优劣点 采用Runnable()、Callable()接口: 优点:还可以继承其他类,可以实现多个线程共享同一个target对象吗,从而可以将CPU,代码和数据分开,体现了较好的面向对象的思想 劣势:编程较为复杂,如果要访问当前线程需要使用Thread.currentThread()方法

黑马程序员_java多线程总结

[亡魂溺海] 提交于 2020-03-12 05:16:55
android培训 、 java培训 、期待与您交流! /* 多线程技术 java虚拟机允许程序并发地运行多个线程。 JVM启动至少有两个线程,一个是主线程(代码在mian方法中);另一个是负责垃圾回收机制的线程。 创建线程 方法一 在java.lang包中有一个Thread类 继承Thread类 步骤: 1,定义类继承Thread. 2,复写Threa类中的run方法; 目的:将自定义代码存储在run方法中,让线程运行。 3,调用start(),该方法有两个作用,就是启动线程,调用run方法。 */ // 例:三个窗口分别买票,每一个窗口卖10张票 class ThreadDemo extends Thread //定义类继承Thread. { public void run() //复习run方法 { int x=1; while(x<=10) { System.out.println(Thread.currentThread().getName()+"....."+x);//打印正在运行的线程 x++; } } } class Test { public static void main(String[] String) { new ThreadDemo().start();//创建第一个线程并运行 new ThreadDemo().start();//创建第二个线程并运行

黑马程序员_java08_多线程

丶灬走出姿态 提交于 2020-03-12 05:16:13
转载于: http://www.itxuexiwang.com/plus/view.php?aid=148 线程是程序中可以并行执行的任务。 java运行系统总是选当前优先级最高的处于就绪状态的线程来执行。如果几个就绪线程有相同的优先级,将会用时间片方法轮流分配处理机。 进程与线程的区别 进程属于一个独立的运行程序,线程是程序里面的一个分支。许多个线程组成一个程序的运行。 创建线程的两种方式 (1)线程类是由Thread类及其子类表示的,继承Run()方法定义了线程执行时的任务体,定义一个继承于Thread的线程类覆盖run()方法。 (2)任何实现接口Runnable的对象都可以作为一个线程的目标对象,类Thread本身也实现了接口Runnable,接口中的run()方法需要实现为线程执行的任务体。 (3)可以利用Thread的类方法currentThread()获得当前执行线程的信息。 方法一: public class Person extends Thread{ public Person(String name){ this.name=name; } @Override public void run(){ super.run(); } } 1 2 3 4 5 6 7 8 9 方法二: class Res { private String name; private

黑马程序员----多线程基础

二次信任 提交于 2020-03-12 05:15:53
/** * @author Administrator * * @description Java多线程编程入门测试类 * @history */ // 方法一、继承线程类Thread class MyThread extends Thread{ public MyThread(String threadName){ // 设置当前线程的名称 currentThread().setName(threadName); } public void run(){ System.out.println(Thread.currentThread().getName()); } } // 方法二、实现Runnable接口 class MyThread2 implements Runnable{ public void run() { System.out.println(Thread.currentThread().getName()); } } public class SynTestDemo { /** *@description *@param args */ public static void main(String[] args) { // 1、线程的定义、线程和进程的区别、为什么要引入线程等 // 2、 Java实现多线程的方法主要有两种

多线程(线程安全问题)

徘徊边缘 提交于 2020-03-12 05:14:17
这里以买票为例: 继承Thread的第一种创建线程的方法,不易满足多个线程共享一块数据资源的需求。 所以采用实现Runnable接口的第二种方法来创建线程。 class Ticket implements Runnable{ private int num = 100; public void run() { sale(); } public void sale (){ while(true){ if(num > 0) { try{Thread.sleep(10);}catch(InterruptedException e){} System.out.println(Thread.currentThread().getName()+"****"+num); num --; } } } } class ThreadDemo { public static void main (String[] arg){ Ticket d = new Ticket(); Thread t1= new Thread(d); Thread t2 = new Thread(d); Thread t3 = new Thread(d); Thread t4 = new Thread(d); t1.start(); t2.start(); t3.start(); t4.start(); } }

黑马程序员-多线程

丶灬走出姿态 提交于 2020-03-12 05:10:35
多线程 进程:是一个正在执行的程序 。 线程:就是进程中的一个独立的控制单元,线程在控制进程的执行,一个进程中至少有 一个线程。 java VM 启动的时候会有一个进程java.exe。该进程中至少有一个负责java程序的执行,而且这个线程运行的代码存在于main方法中,该线程称之位主线程。 多线程的一个特性 ;随机性,谁抢到谁执行,至于执行对长,cpu说了算 创建新执行线程有两种方法。一种方法是将类声明为Thread的子类。该子类应重写Thread类的run方法。 1. 如何在自定义的代码中,自定义一个线程呢? 通过对api的查找,java已经提供了对线程这类事物的描述,就是Thread类。 创建线程的第一种方式:继承Thread类。 步骤: 1.定义类继承Thread 2.复写Thread类中的run方法 目的;将自定义代码存储在run方法中,让线程运行 3.调用线程的start方法 该方法有两个作用:启动线程,调用run方法(存储要执行的代码) 为什么要覆盖 run 方法呢? Thread 用于描述线程。 该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。 也就是说Thread类中的run方法,用于存储线程要运行的代码。 线程的五种状态: 被创建:start() 冻结状态(睡眠,等待):放弃了执行资格 运行,阻塞可以到达 注:在同步代码中,wait(