黑马程序员-多线程
2012-06-08 12:12
453 查看
---------------------- android培训、java培训、期待与您交流! ----------------------
多线程:
1) 进程:
是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元
2) 线程:
进程中的一个独立的控制单元,一个进程至少有一个线程。
3) 线程:
java vm启动的时候就会有一个java.exe进程。该进程至少有一个线程负责java程序的执行,而且这个线程存在与main方法中。该线程称为主线程。
4) 线程运行状态
5) 线程创建方式:
a) 区别:1.2.3
b) 同步:前提:1.两个以上的线程2.同一个锁 好处: 弊端:
c) 如何找问题:1.多线程代码2.共享数据3.操作共享数据的语句
6) 线程同步:
a) 同步代码块,
b) 同步函数(同步锁是this对象即调用函数的对象)
c) 静态同步函数:(同步锁是Class对象)
d) 单列设计模式(懒汉式)
e) 同步条件
7) 死锁:同步嵌套同步(锁不同)
8) 线程间的通信:
9) 等待唤醒机制:
a) wait()、notify()、notifyAll()都使用在同步中,因为要对持有监视器(锁)的线程进行操作。格式:锁.方法()
b) 为什么操作线程的方法要定义在Object类中呢?
因为这些方法在操作线程同步时,都必须要标识它们所操作的线程持有的锁。只有同一个锁上的被等待线程能被同一个锁上的notify()唤醒。
等待和唤醒必须是同一个锁,锁可以是任意对象,可以被任意对象调用的方法定义在Object类中。
10) 生产者消费者:两类(单个和多个)
特别注意:wait()被唤醒时,需要再次判断(判断时使用while),否则会出现重复生产或者重复消费。
a) 使用while判断notify()时会出现全部等待(wait)的现象,所以使用notifyAll()。但是效率低
b) 多线程安全问题Jdk1.5升级解决方案
使用了Lock锁接口代替syschronized,由Lock锁获得Condition的对象,在该对象上操作await(),signal(),signalAll()方法
单例设计模式:
1、饿汉式:private static Person = new Person();
2、懒汉式:方法中new对象;
出现问题:多线程安全
解决:
方法上加synchronized效率低、双重判断加synchronized
练习:
package org.cc.thread;
//继承Thread类实现
class Thread1 extends Thread {
private int a=1;
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() +" "+ (a++));
}
}
}
public class ThreadDemo1 {
public static void main(String[] args) {
threadStart();
}
private static void threadStart() {
Thread1 t = new Thread1();//创建线程
Thread1 t1 = new Thread1();
t1.start();//启动线程
t.start();
}
}
生产者消费者:
package org.cc.thread;
//生产者消费者问题
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//商品资源类
class Res {
private String name;
private int count = 0;
private Lock lock = new ReentrantLock();
private Condition conpro = lock.newCondition();
private Condition concom = lock.newCondition();
private boolean flag = false;
public Res(String name) {
this.name = name;
}
public void pro() throws InterruptedException {
lock.lock();
while (flag) {
conpro.await();
}
try {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("pro..." + name + (++count));
flag = true;
concom.signal();
} finally {
lock.unlock();
}
}
public void com() throws InterruptedException {
lock.lock();
while (!flag) {
concom.await();
}
try {
System.out.println("com......" + name + count);
flag = false;
conpro.signal();
} finally {
lock.unlock();
}
}
}
//生产者类
class Pro implements Runnable {
private Res r;
public Pro(Res r) {
this.r = r;
}
public void run() {
while (true) {
try {
r.pro();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//消费者类
class Com implements Runnable {
private Res r;
public Com(Res r) {
this.r = r;
}
public void run() {
while (true) {
try {
r.com();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//测试类
public class ProComDemo1 {
public static void main(String[] args) {
Res r = new Res("商品");
Pro p = new Pro(r);
Com c = new Com(r);
new Thread(p).start();
new Thread(c).start();
new Thread(p).start();
new Thread(c).start();
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
多线程:
1) 进程:
是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元
2) 线程:
进程中的一个独立的控制单元,一个进程至少有一个线程。
3) 线程:
java vm启动的时候就会有一个java.exe进程。该进程至少有一个线程负责java程序的执行,而且这个线程存在与main方法中。该线程称为主线程。
4) 线程运行状态
5) 线程创建方式:
a) 区别:1.2.3
b) 同步:前提:1.两个以上的线程2.同一个锁 好处: 弊端:
c) 如何找问题:1.多线程代码2.共享数据3.操作共享数据的语句
6) 线程同步:
a) 同步代码块,
b) 同步函数(同步锁是this对象即调用函数的对象)
c) 静态同步函数:(同步锁是Class对象)
d) 单列设计模式(懒汉式)
e) 同步条件
7) 死锁:同步嵌套同步(锁不同)
8) 线程间的通信:
9) 等待唤醒机制:
a) wait()、notify()、notifyAll()都使用在同步中,因为要对持有监视器(锁)的线程进行操作。格式:锁.方法()
b) 为什么操作线程的方法要定义在Object类中呢?
因为这些方法在操作线程同步时,都必须要标识它们所操作的线程持有的锁。只有同一个锁上的被等待线程能被同一个锁上的notify()唤醒。
等待和唤醒必须是同一个锁,锁可以是任意对象,可以被任意对象调用的方法定义在Object类中。
10) 生产者消费者:两类(单个和多个)
特别注意:wait()被唤醒时,需要再次判断(判断时使用while),否则会出现重复生产或者重复消费。
a) 使用while判断notify()时会出现全部等待(wait)的现象,所以使用notifyAll()。但是效率低
b) 多线程安全问题Jdk1.5升级解决方案
使用了Lock锁接口代替syschronized,由Lock锁获得Condition的对象,在该对象上操作await(),signal(),signalAll()方法
单例设计模式:
1、饿汉式:private static Person = new Person();
2、懒汉式:方法中new对象;
出现问题:多线程安全
解决:
方法上加synchronized效率低、双重判断加synchronized
练习:
package org.cc.thread;
//继承Thread类实现
class Thread1 extends Thread {
private int a=1;
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() +" "+ (a++));
}
}
}
public class ThreadDemo1 {
public static void main(String[] args) {
threadStart();
}
private static void threadStart() {
Thread1 t = new Thread1();//创建线程
Thread1 t1 = new Thread1();
t1.start();//启动线程
t.start();
}
}
生产者消费者:
package org.cc.thread;
//生产者消费者问题
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//商品资源类
class Res {
private String name;
private int count = 0;
private Lock lock = new ReentrantLock();
private Condition conpro = lock.newCondition();
private Condition concom = lock.newCondition();
private boolean flag = false;
public Res(String name) {
this.name = name;
}
public void pro() throws InterruptedException {
lock.lock();
while (flag) {
conpro.await();
}
try {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("pro..." + name + (++count));
flag = true;
concom.signal();
} finally {
lock.unlock();
}
}
public void com() throws InterruptedException {
lock.lock();
while (!flag) {
concom.await();
}
try {
System.out.println("com......" + name + count);
flag = false;
conpro.signal();
} finally {
lock.unlock();
}
}
}
//生产者类
class Pro implements Runnable {
private Res r;
public Pro(Res r) {
this.r = r;
}
public void run() {
while (true) {
try {
r.pro();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//消费者类
class Com implements Runnable {
private Res r;
public Com(Res r) {
this.r = r;
}
public void run() {
while (true) {
try {
r.com();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//测试类
public class ProComDemo1 {
public static void main(String[] args) {
Res r = new Res("商品");
Pro p = new Pro(r);
Com c = new Com(r);
new Thread(p).start();
new Thread(c).start();
new Thread(p).start();
new Thread(c).start();
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
相关文章推荐
- 黑马程序员-java多线程
- 黑马程序员 ---- 多线程
- 黑马程序员_多线程总结
- 黑马程序员之JAVA学习笔记:多线程学习大总结
- 黑马程序员--JAVA基础复习之多线程(一)概念与创建方法
- 黑马程序员——多线程
- 黑马程序员--多线程概述和常见问题
- 黑马程序员---Java基础总结--多线程
- 黑马程序员:多线程
- 黑马程序员---java多线程学习总结
- 黑马程序员_学习笔记第12天——多线程2
- 黑马程序员_多线程
- 黑马程序员学习笔记七——多线程
- 黑马程序员——多线程知识总结
- 黑马程序员 java中的多线程
- 黑马程序员-----java----多线程
- 黑马程序员——多线程基本概念
- 黑马程序员-Java多线程
- 黑马程序员_多线程
- 黑马程序员_多线程