预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共15页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

多线程 1、进程:一个应用程序在内存中开辟的所属空间; 2、一个进程可以有多个执行路径,叫做多线程; 3、一个进程中至少要有一个线程; 4、线程执行 5、线程创建方法一、 (1)定义一个类来继承Thread类; (2)覆盖Thread类中的run方法; (3)直接创建Tread子类对象,创建线程; (4)调用start方法开启线程并调用线程任务; 简单例子: importstaticorg.junit.Assert.*; importorg.junit.Test; publicclassTreadTest{ @Test publicvoidtest(){ MyThreadmy1=newMyThread("旺财"); MyThreadmy2=newMyThread("wangcai"); my1.start(); my2.start(); } } classMyThreadextendsThread{ privateStringname; MyThread(Stringname){ this.name=name; } publicvoidrun(){ for(inti=0;i<10;i++) { System.out.println(name+";;;;x="+i); } } } 6、线程中得到当前线程的线程名称: "当前线程名称:"+Thread.currentThread().getName() 7、线程的四种状态 8、实现线程的创建方法二、 (1)定义类实现Runnable接口; (2)覆盖接口中的run方法,将线程任务方法封装到run方法中; (3)通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。 因为:线程的任务都封装在Runnable接口子类对象的run方法中; 所以要在线程对象创建时就必须明确要运行的任务; (4)调用线程对象的start方法开启线程; 9、Runnable的好处 10、线程的安全隐患 11、安全隐患的解决方法 12、同步代码块案例 classMyThread3implementsRunnable{ privateintnum=100; Objectobj=newObject(); publicvoidrun(){ while(true) { synchronized(obj){ if(num>0) { try{ Thread.sleep(10); }catch(InterruptedExceptione){} System.out.println(Thread.currentThread().getName()+".........."+num--); } } } } } publicclassThreadd{ publicstaticvoidmain(String[]args){ MyThread3my=newMyThread3(); Threadt1=newThread(my); Threadt2=newThread(my); Threadt3=newThread(my); Threadt4=newThread(my); t1.start(); t2.start(); t3.start(); t4.start(); } } 13、同步锁的利与弊 好处:能够解决线程安全问题 坏处:相对降低了效率,因为同步外的线程都会判断同步锁; 14、同步的前提: 同步中必须有多线程,并使用同一个锁; 14、属于线程的代码 15、同步第一种:同步代码块 同步第二种:同步函数 16、同步函数锁 17、同步锁要保证是唯一的 18、在线程同步上既要考虑线程安全问题,又要考虑效率问题; 19、单例模式下,还是饿汉式;但是懒汉式面试用的多 20、线程通信案例 /* 线程间通讯: 多个线程在处理同一资源,但是任务却不同。 */ //资源 classResource{ Stringname; Stringsex; } classInputimplementsRunnable{ Resourcer; //Objectobj=newObject();//公用同一个资源 Input(Resourcer){ this.r=r; } publicvoidrun(){ intx=0; while(true){ synchronized(r){ if(x==0){ r.name="mike"; r.sex="nan"; } else{ r.name="丽丽"; r.sex="女女女女女女";}} x=(x+1)%2;}}}//此处可以实现标示在0与1之间切换 classOutputimplementsRunnable{ Res