您的位置:首页 > 职场人生

黑马程序员-多线程

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: