2013年(92)
分类: 信息化
2013-03-17 02:38:47
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -------android练习、java练习、等候与您交流! ---------- 一.? 概述 ? 1. 进程:正在进行中的程序(直译)。进程其实对应一个应用程序在内存中的空间。 ? 2. 线程:就是进程中一个担任程序实行的实行方法 ?????????????????? 一个进程中可以有多个 实行方法,称之为多线程。一个进程中至少要有一个线程。 ?????? 打开多个线程是为了一同工作多有些代码。每一个线程都有自己工作的内容。这个内容可以称为线程要实行的任务。 ? 3.? 长处与害处: ?????????????? 长处:处置了多有些一同工作的疑问。 ?????????????? 害处:线程太多?功率降低。cpu的快速切换依赖于时辰片。 ? 4. JVM启动时就启动了多个线程,至少有两个线程可以分析的出来。 ????????????? 1.实行main函数的线程。该线程的代码都定义在main函数中。 ????????????? 2.担任废物回收的线程。 ? 5. finalize:当废物回收机制判定不存在对该方针的更多引用时,由方针的废物回收器调用此方法。 二.??线程 ? 1. 如何创建一个线程-----继承Thread类 ????????????? 1. 创建线程的一种方法是将类声明为Thread的子类。该子类大约重写Thread类的run方法。 ????????????????????????????? 进程:1.定义一个类,继承Thread类。 ????????????????????????????????????????? 2.掩盖Thread类中的run方法。 ????????????????????????????? 创建线程的目的是为了打开一条实行方法,去工作指定的代码,和其他代码结束一同工作?。而工作的指定代码就是这个实行方法的任务。JVM创建的 ????????????????????????? 主线程的任务都定义在了主函数中。而自定义的线程的任务在哪儿呢? ????????????????????????????? Thread类用于描写线程,线程是需要任务的,所以Threaf也有对任务的描写。这个任务就通过Thread类中的run方法来体现,也就是说,run方法就是 ????????????????????????? 封装。自定义线程工作任务的函数。run方法中定义的就是线程要工作的任务代码。打开线程是为了工作指定代码,所以只需继承Thread类,并覆写run ????????????????????????? 方法。将工作的代码定义在run方法中。 ????????????????????????????????????????? 3.创建Thread类的子类方针,创建线程。 ????????????????????????????????????????? 4.调用start方法打开线程。并调用线程的任务run方法实行。 ?????????????2. Thread类中的方法线程称谓。可以通过Thread类中的getName获取线程的称谓。Thread-编号(从0初步) ????? ? ? ? ? ? ? 主线程的名字是main ????????????????? currentThread回来其时正在实行的线程方针的引用。 ????????????????? Thread.currentThread().getName()回来其时正在工作的线程的称谓。 class Demo extends Thread{ private String name; Demo(String name){ //super(name);Thread中的规划函数,可以给线程自定义名字。 this.name = name; } public void run(){ for (int i = 0; i < 10; i ) { for (int j = -9999999; j < 99999999; j ) {} System.out.println(name "..." i ".....name=" Thread.currentThread().getName()); } } } public class ThreadDemo1 { public static void main(String[] args) { Demo d1 = new Demo("旺财"); Demo d2 = new Demo("xiaoqiang"); d1.start();//打开线程,调用run方法 d2.start(); } } ???????????? 3. 创建线程的第二种方法:结束Runnable接口。 ???????????????? 准备扩展Demo类的功用,让其间的内容可以作为线程的任务实行。通过接口的方法结束。 ? ? ? ? ? ? ? ?? 进程:?? 1.定义类结束Runnable接口。 ??????????????????????????????? 2.掩盖接口中的run方法,将线程的任务代码封装到run方法中。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.通过Thread类创建线程方针,并将Runnable接口的子类方针作为规划函数的参数进行传递。 ????????????? ? ? ? ? ? ? ? ? ? ?? 为什么呢?因为线程的任务都封装在Runnable接口子类方针的run方法中,所以要在线程方针创建时就有必要明晰要工作的任务。? ?????????????????????????? ? ? 4.调用线程方针的start方法打开线程。 ????????????????????????????????? Runnable仅仅是将线程的任务进行了方针的封装。 ??????????????? 结束Runnable接口的长处: ????????????????????????????? 1.将线程的任务从线程的子类中分离出来,进行了单独的封装。按照面向方针的思维将任务封装成方针。 ????????????????????????????? 2.避免了java单继承的局限性。所以,创建线程的第二种方法较为常用。 class Demo2 implements Runnable{ //结束Runnable接口 public void run(){ show(); } public void show(){ //重写run方法 for (int i = 0; i < 15; i ) { System.out.println(Thread.currentThread().getName() "..." i ); } } } public class RunnableDemo2 { public static void main(String[] args) { Demo2 d1 = new Demo2(); Demo2 d2 = new Demo2(); Thread t1 = new Thread(d1); Thread t2 = new Thread(d2); t1.start(); //打开线程 t2.start(); } } 三.? 线程安全疑问发生的缘由: ?? 1.多个线程在操作同享的数据。 ?? 2.操作同享数据的线程代码有多条。 ????? 当一个线程在指向操作同享数据的多条代码进程中,其他线程参与了运算,就会致使线程安全疑问。 ????? 处置思路: ????????????? 就是将多条操作同享数据的线程代码封装起来,当有线程在实行这些代码的时分,其他线程不可以参与运算。必需要其时线程把这些代码都实行结束后,其他 ????? 线程才可以参与运算。在java中,用同步代码块就可以处置这个疑问。 ????? 同步代码块的格式: synchronized(方针){ //需要被同步的代码; }????? 同步的长处和害处。 ????????????? 同步的长处:处置了线程的安全疑问。 ????????????? 同步的害处:相对降低了程序的功率,因为同步外的线程都会区分同步锁。 ????????????? 同步的条件:同步中有必要有多个线程,并运用同一个锁。 ????????????? 同步函数的锁是this: ????????????? 同步函数和同步代码块的区别:?????? 同步函数的锁是固定的this。?? 同步代码块的锁是尽情的方针。?? 建议运用同步代码块。 ????????????? 静态的同步函数运用的锁是:该函数所属的字节码文件方针。可以用getClass获取,也可以用?其时类名.class标明。 Class clazz1 = t.getClass(); Class clazz2 = Ticket2.class; class Ticket2 implements Runnable { private int num = 100; Object obj = new Object(); boolean flag = true; //符号 //重写run方法 public void run(){ if(flag){ while(true){ synchronized(this){//Ticket2.class或许this.getClass() if(num>0){ try { Thread.sleep(10); } catch (InterruptedException e) { //失常处置代码 } System.out.println(Thread.currentThread().getName() "...code..." num--); } } } else{ while(true) show(); } } //同步方法 public synchronized void show(){ if(num>0){ try { Thread.sleep(10); } catch (InterruptedException e) { //失常处置代码 } System.out.println(Thread.currentThread().getName() "...func..." num--); } } } public class synchronized FunctionLockDemo5 { public static void main(String[] args) { Ticket2 t = new Ticket2(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); try { Thread.sleep(10); } catch (InterruptedException e) { //处置失常 } t.flag = false; t2.start(); } } 四.??死锁 : 常见景象之一:同步的嵌套。同步中还有同步。(面试中可能会出现) class Test implements Runnable{ private boolean flag; //传人标签 Test(boolean flag){ this.flag = flag; } @override public void run(){ if(flag){ while(true){ synchronized(MYlock.locka){ System.out.println("if...locka..."); synchronized(MYlock.lockb){ System.out.println("if...lockb..."); } } } }else{ while(true){ synchronized(MYlock.lockb){ System.out.println("else...lockb..."); synchronized(MYlock.locka){ System.out.println("else...locka..."); } } } } } } class MYlock{ public static final Object locka = new Object(); public static final Object lockb = new Object(); } public class DeadLockDemo8 { public static void main(String[] args) { Test a = new Test(true); Test b = new Test(false); Thread t1 = new Thread(a); Thread t2 = new Thread(b); t1.start(); t2.start(); } } 五.? 线程间通讯 :? 多个线程在处置同一资源,可是任务却不一样。 ? 1.? 等候唤醒机制: ?????????????? 触及的方法: ????????????????????? 1.wait();让线程处于冻住情况,被wait的线程会被存储到线程池中。 ????????????????????? 2.notify();唤醒线程池中的尽情一条线程。 ????????????????????? 3.notifyAll();唤醒线程池中一切的线程。 ????????????? 这些方法都有必要定义在同步中。因为这些方法是用于操作线程情况的方法,必需要明晰终究操作的是哪个锁上的线程。r.wait();??r.notify(); ? 2. 为什么操作线程的方法,wait?notify??notifyAll定义在了Object中? ? ? ? ? ? ? ? 因为这些方法是监督器的方法。监督器其实就是锁。锁可以是尽情的方针,而尽情的方针调用的方法一定定义在Object中。 ? 3. 多生产者多消费者疑问。? ????????????? if区分符号只需一次,会致使不该工作的线程工作了,会出现数据差错的情况。 ????????????? while区分符号,处置了线程获取实行权后,能否要工作。 ????????????? notify:只能唤醒一个线程,如果唤醒了本方,没有意义。而且while区分符号 notify会致使死锁。 ????????????? notifyAll?处置了本方线程一定会唤醒对方线程的疑问。 ??????代码示例: class Resource2{ private String name; private int count = 1; private boolean flag = false; public synchronized void set(String name){ while(flag) try{ this.wait(); }catch(InterruptedException e){} this.name = name count; count ; System.out.println(Thread.currentThread().getName() "...生产者" this.name); flag = true; notifyAll(); } public synchronized void get(){ while(!flag) try{this.wait();} catch(InterruptedException e){} System.out.println(Thread.currentThread().getName() "...消费者..." this.name); flag = false; notifyAll(); } } //生产者 class Producer implements Runnable{ Resource2 r; Producer(Resource2 r){ this.r = r; } public void run(){ while(true){ r.set("烤鸭"); } } } //消费者 class Consumer implements Runnable{ Resource2 r; Consumer(Resource2 r){ this.r = r; } public void run(){ while(true){ r.get(); } } } public class ConsumerDemo2 { public static void main(String[] args) { Resource2 r = new Resource2(); Producer pro = new Producer(r); Consumer con = new Consumer(r); Thread t0 = new Thread(pro); Thread t1 = new Thread(pro); Thread t2 = new Thread(con); Thread t3 = new Thread(con); t0.start(); t1.start(); t2.start(); t3.start(); } } 六.? JDK1.5处置方法: ??????? jdk1.5往后将同步和锁封装成了方针。并将操作锁的隐式方法定义到了该方针中,将隐式的行动变成了闪现行动。 ??????? Lock接口:出现替代了同步代码块或许同步函数。将同步的隐式锁操作变成了闪现锁操作。一同更为活络,可以一个锁上加上多组监督器。 ??????? lock():获取锁 ??????? unlock():开释锁,通常需要定义在finally代码块中。 ??????? Condition接口:出现替代了object中的wait??notify??notifyAll方法。 ??????? 将这些监督器方法单独进行了封装,变成Condition监督器方针。可以和尽情的锁进行组合。? await();???? signal();???? signalAll(); import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Resource3{ private String name; private int count = 1; private boolean flag = false; //创建一个锁方针。 Lock lock = new ReentrantLock(); //通过已有的锁获取该锁上的监督器方针。 //Condition c = lock.newCondition(); //通过已有的锁获取两组监督器,一组监督生产者,一组监督消费者。 Condition producer_con = lock.newCondition(); Condition consumer_con = lock.newCondition(); public void set(String name){ lock.lock(); try{ while(flag) try{producer_con.await();} catch(InterruptedException e){} this.name = name count; count ; System.out.println(Thread.currentThread().getName() "...生产者" this.name); flag = true; consumer_con.signal(); } finally{ lock.unlock(); //关闭锁 } } public void get(){ lock.lock(); try{ while(!flag) try{consumer_con.await();} catch(InterruptedException e){} System.out.println(Thread.currentThread().getName() "...消费者..." this.name); flag = false; producer_con.signal(); } finally{ lock.unlock(); } } } //生产者 class Producer2 implements Runnable{ Resource3 r; Producer2(Resource3 r){ this.r = r; } public void run(){ while(true){ r.set("烤鸭"); } } } //消费者 class Consumer2 implements Runnable{ Resource3 r; Consumer2(Resource3 r){ this.r = r; } public void run(){ while(true){ r.get(); } } } public class NewJDKDemo3 { public static void main(String[] args) { Resource3 r = new Resource3(); Producer2 pro = new Producer2(r); Consumer2 con = new Consumer2(r); Thread t0 = new Thread(pro); Thread t1 = new Thread(pro); Thread t2 = new Thread(con); Thread t3 = new Thread(con); t0.start(); t1.start(); t2.start(); t3.start(); } }七.? 多线程中的一点小细节: ? 1.? wait和sleep的区别。 ?????????????? 1.wait可以指定之时辰也可以不指定。?????????? sleep有必要指定之间。(sleep一定会醒,wait不一定会醒) ?????????????? 2.在同步中时,关于cpu的实行权和锁的处置不一样。 ????????????????????????? wait:开释实行权,开释锁。 ? ? ? ? ? ? ? ? ? ? ? ? ? sleep:开释实行权,不开释锁。 ? 2. 同步中可以有多条线程,可是只需一个线程在实行,谁拿锁谁实行。 ? 3. 间断线程:???? 1.stop方法(已过期)。 ??????????????????????????????? 2.run方法结束。 ????? 如何控制线程的任务结束呢? ????????????? 任务中都会有循环规划,只需控制住循环就可以结束任务。控制循环通常就用定义符号来结束。可是如果线程处于冻住情况,无法读取符号,如何结束呢? ????????????? 可以运用interrupt();方法将线程从冻住情况逼迫恢复到工作情况中来,让线程具有cpu的实行资格。可是逼迫行动会发生InterruptedException失常,记得要处置。 ? 4. setDaemon()当正在工作的线程都是关照线程时,虚拟机退出。 ????? 如果一切的前台线程都结束,后台线程无论处于何种情况都会自动结束。 ? 5. 暂时参与一个线程运算是,可以使join方法。 ????????????? t1.join();//t1线程要请求参与进来工作。主线程会开释实行资格(冻住情况),t1结束后再实行。 ????????????? 哪个线程实行到join方法,哪个线程会开释实行资格,处于冻住情况, ????? join?线程结束后恢复。 ? 6. toString()线程的字符串体现方法。 ? 7.? 线程优先级在1到10之间10个数。优先级越大被实行到的几率越大。 ??????? t1.setPriority(Thread.MAX_PRIORITY);设置线程t1的优先级为10.?? 默许优先级是5 ? 8. 线程组:ThreadGroup ? 9. yield()方法??可以使线程暂停,暂时开释实行权。 ???????????????????????????????????????????????????? -------android练习、java练习、等候与您交流! ----------