Chinaunix首页 | 论坛 | 博客
  • 博客访问: 189378
  • 博文数量: 92
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1413
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-04 21:12
文章分类
文章存档

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练习、等候与您交流! ----------  
阅读(400) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~