多线程
1、线程、进程
进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行;
一个进程中至少有一个线程。
2、创建多线程方式
方式一:继承Thread类。
步骤:1,定义类继承Thread。
2,复写Thread类中的run方法。
3,调用线程的start方法,
方式二:实现Runnable接口
步骤:1.建立Runable对象
2.使用参数为Runnable对象的构造方法创建Thread;
3.调用startfang方法启动线程。
3.Thread与Runnable实现方式的区别:
继承Thread:线程代码存放Thread子类run方法中。
实现Runnable,线程代码存在接口的子类的run方法。
Runnable好处:避免了单继承的局限
4、线程同步机制
同步机制中如何找到问题:
明确哪些代码是多线程运行代码;
确定共享数据;
确定多线程运行代码中哪些是操作共享数据;
5、同步方法中使用的锁的不同:
6、死锁
死锁出现情况:同步嵌套
/* 需求:编写一个死锁程序 思路:死锁常出现在嵌套同步块的程序中 */ package unit18; class ObjectLock{ static ObjectLock objA = new ObjectLock(); static ObjectLock objB = new ObjectLock(); } class DeadTest implements Runnable{ private Boolean flag; DeadTest(Boolean flag){ this.flag = flag; } public void run(){ if(flag){ while(true){ synchronized(ObjectLock.objA){//获得锁A,请求锁B System.out.println(Thread.currentThread().getName()+".....lock objA"); synchronized(ObjectLock.objB){ System.out.println(Thread.currentThread().getName()+".....lock objB"); } } } }else{ while(true){ synchronized(ObjectLock.objB){//获得锁B,请求锁A System.out.println(Thread.currentThread().getName()+".....lock objB"); synchronized(ObjectLock.objA){ System.out.println(Thread.currentThread().getName()+".....lock objA"); } } } } } } public class DeadLockTest { public static void main(String args[]){ Thread t1 = new Thread(new DeadTest(true)); Thread t2 = new Thread(new DeadTest(false)); t1.start(); t2.start(); } }
7.线程间通信
线程间通讯:
其实就是多个线程在操作同一个资源,但是操作的动作不同。
/* 线程间通信 需求:输入线程为资源对象信息赋值,输出线程输出对象细信息 */ package unit18; //定义资源对象Person class Person{ public String name; public String sex; public Boolean flag= false;//flag为false表示对象信息值为空 // Person(String name,String sex){ // this.name = name; // this.sex = sex; // } } //定义输入类Input class Input implements Runnable{ private Person per; Input(Person per){ this.per = per; } public void run(){ int x = 0; while(true){ synchronized(per){ if(per.flag)//如果标记为真,暂停输入线程,等待输出线程输出对象信息 try {per.wait();} catch (InterruptedException e) {} //如果标记为假,输入线程输入信息 if(x==0){ per.name = "mike"; per.sex = "man"; }else{ per.name = "王丽"; per.sex = "女"; } x = (x+1)%2; per.flag = true; per.notify(); } } } } //定义输出类Output class Output implements Runnable{ private Person per; Output(Person per){ this.per = per; } public void run(){ while(true){ synchronized(per){ if(!per.flag) try { per.wait();} catch (InterruptedException e) {} System.out.println(per.name + "......"+ per.sex); per.flag = false; per.notify(); } } } } public class InputOutputTest { public static void main(String args[]){ Person per = new Person (); Thread t1 = new Thread(new Input(per)); Thread t2 = new Thread(new Output(per)); // Thread t3 = new Thread(new Input(per)); // Thread t4 = new Thread(new Output(per)); t1.start(); t2.start(); // t3.start(); // t4.start(); }
总结:学习多线程后,编程思想和以前截然不同;现实中很多事物都具有多线程性质,所以我们因该积极转换编程思维,已进入多线程编程的思维方式。
原文:http://www.cnblogs.com/chizhongyue/p/4606049.html