-多线程-
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
根} 据Runnable接口的实现类创建Thread对象,并给线程起个名字
}
案例:实现Runnable接口编写线程类
案例:借助Thread类启动线程
继承Thpracekagae dcn类.sxt.s与hare;实现Runnable接口的区别
继示J承a例vT1ah6中-r7e的ad类类具实有现pu单多bpl继i线ucb承cs程liluca的ps有Tesi特rc一T(kni点eca定tkmTe,的hetTr)如;eh局ard果e限a(Sd一性trei个nxgt类enna继dms承eT)h{了reaTdh{read类那么就不能再继承其它的类了,所以
创f建orTh(irnetaid对= 0象; ,i <并5给; i+线+程) {起个名字
Thread(Runnable target) Thread(Runnable target, String name)
根据RuSnynsatbelme接.o口ut的.pr实in现tln类("创==建==Th=r=e=a=d=对=象==main中的i=" + i); }
}
TicketThread t3=new TicketThread("C窗口");
}
t1.start();//启动线程,开始售票
看到每个窗口各卖了5张票,3个窗口一共卖了t125.s张ta,rt()产; 生的原因是三个线程类的对象,
每个对象都有一个独立的属性ticket
t3.start(); }
}
继承Thread类与实现Runnable接口的区别
} }
线程的生命周期
新生状态:一个线程类使用new关键字创建完对象,在堆内存开辟内存空间 ,所以说处 于新生状态的线程有自己的内存空间
就绪状态:使用start()方法开始启动线程,那么线程处于就绪状态,处于就绪状态的线 程具备了运行的所有条件,但是还没有得到CPU的调度,通常被称为“万事具备,只欠CPU 调度”,就绪状态的线程具备了运行资格,不具备运行条件
for (int i = 0; i < 100; i++) {
Thread t3=new Thread(tr,"C窗口");
if (ticket > 0) {
t1.start();
System.out.println(Thread.currentTht2r.esatdar(t)(.g);etName() + "卖第" + (ticket--) + "张票");
}
使用Runnable接口p实riv现at多e in线t t程ick的et优=5点; :
避免单继承 @Override
方便共享资源,pu同bl一ic份vo资id源r多un个()代{ 理访问 for(int i=0;i<100;i++){
package cn.sxt.share;
案口例实: 现有三个窗口共卖5}张i}票f(ti,cSkye每st>t个e0m){窗.ou口t.p有ri1nt0l0n个(su人ppue排br.lgic队eTTptciiuNcc,lbakkalseem分icsttTTeTs别hh(et)rra+see使t"taaiT卖cdd用icv第ttko21继e"i==d+tnnT承(meethiwwcraTekihTTnaeriid(tccS-e-kk{t)aree+idttn"TT类张ghh[rr票]和eeaaa"r实)ddg;((s""现)BA{窗 窗Ru口 口n""n))a;; ble接
} public static void main(String[] args) {
构造方法
MyRunnable myRun=n方ew法M参y数Ru描n述nable();
Thread()
创T建hTrheraedadt=对n象ew Thread(myRun); t.start();
Thread(String name)
实现Runnable接口
System.out.println("MyThread中的run方法中的代码");
实现Callable接口
} }
继承Thread类实现多线程的步骤
示例16-2
编写类继承Thread
package cn.sxt.thread;
重写Thread中的run()方法
public class TestMyThread { public static void main(String[] args) {
在run()方法中所编写的代码称为线程M体yThread my=new MyThread(); 案例:继承T运 MmhyyrT.行ehsartJdeaa类arvdta编(程m)写y序 启=线n时 动e程w启my类M动线yT了程hr,Jeaav这da(个虚})拟时之机候前} mS有,有yys.st负两一etamr责个个t.(o)线执线u; t.行程程pri主,,ntl线一线n("个程程---(是的----主主名----线称方---法为程-m),maain中一i方n个的是法中代是主的码m线y代,程线码在,程");执,使行用
public void run() {
for(int i=0;i<10;i++){
案例:线程体中使用循环
System.out.println("MyThread2中的i="+i+"--------------------");}} Nhomakorabea}
案例:示测例试16线-4 程的使用package cn.sxt.thread;
@Override public String call() throws Exception { String [] array={"apple","banana","orange","grape","pear"}; int random=(int)(Math.random()*4)+1; return array[random]; } package cn.sxt.ca}llable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class Test { public static void main(String[] args) throws InterruptedException, ExecutionException { RandomCallable rc=new RandomCallable(); FutureTask<String> ft=new FutureTask<>(rc); Thread t=new Thread( ft );
private int ticket=5;
TicketRunnable tr=new TicketRunnable();
@Override
Thread t1=new Thread(tr,"A窗口");
public void run() {
Thread t2=new Thread(tr,"B窗口");
Java中实现多线程的方式
在Java中实现多线程的示方例式16-有1 三种 继承Thread类
package cn.sxt.thread; public class MyThread extends Thread {
一个普通类继承Thread类,这个类就@p具Ouvb备elircr了ivdoe多id线ru程n()操{ 作的能力
在start()方法Sy之ste前m.,ou任t.p务rin是tln没("任有务完是成否的已完,成因:"为+ 还ft.is没D有on启e()动); 线程,所以isDone()的结果为false, 当使用get()方t.s法tar获t();取到结果后,说明任务已结完成了,因为只有结果出来,任务才能结束,否 则无论get()方SSyy法ssttee后mm..有oouu多tt..pp少rriinn句ttllnn代(("f任码t.g务都et是(不)否);会已完执成行:"+ ft.isDone() );
任务管理器FutureTask是接口RunnableFuture接口的实现类,而RunnableFuture接口又 继承了Future接口和Runnable接口,所以任务管理器类FutureTask也是Runnable接口的实 现类。通过创建任务管理器类的对象将Callable接口的实现类传入,从而实现多线程
}
t3.start();
}
}
}
}
}
实现Callable接口
Callable接口从JDK1.5开始,与Runnable实现多线程相比,Callable支持泛型,call() 方法可以有返回值,而且还支持泛型的返回值,比run()方法更强大的一点是还可以抛出异 常。 Callable接口中的方法call()需要借助FutureTask这个类进行获取结果,使用Callable 接口实现多线程所需要的类与接口之间的关系
案例:线程类由的于使哪用个线程先“抢占”到CPU资源不确定,所以两句代码哪句先执行也不确定
继承Thread类
在线示程例体16中-3 使用循环,pa程cka序ge的c运n.s行xt.效thr果ea会d;更加明显
public class MyThread2 extends Thread {
@Override
程序
线程
线程的基础知识
进程与线程之间的关系
进程与进程之间是相互独立的,都有自己的内存空间 线程之间互相“抢占”CPU资源,CPU在同一个时间片内只能执行一个线程,时间片
结束再调度其它的线程 一个进程中的线程多了,被CPU调度执行的概率就大,所以多线程操作可以提高程
序的运行效率
一个进程中的线程共享代码和数据空间,线程结束,进程不一定结束,但 是进程结束,线程一定结束。进程中包含线程,线程是进程的组成部分。
public class TestMyThread2 { public static void main(String[] args) { MyThread2 my2=new MyThread2();
注如果意使事用项m:y2在.r启un动()线mf那o程yr(么2inS.时st线ytasi使=rt程e0t(用m;)im;<.y是o120u将;Tti.+hp+没rri)en{有atldn被类("=启中==动s=t=,a=r=那t=(=么)==方只==法=有主,一方而个法非中线调的程的用,fro那ur循n就(环)是i方="主法+i),; 线程,程序无论运行} 多少次,结果都相同
实现Callable接口 package cn.sxt.callable;
示案例例16:-9 实现Callable接口ipmu实pboli现rct c多jalav线sas.u程Rtial.ncdoonmcuCrraellnatb.Cleailmlabpllee;ments Callable<String> {
示例16-8
package cn.sxt.share;
package cn.sxt.share;
public class TestTicketRunnable {
public class TicketRunnable implements Runnabplueb{lic static void main(String[] args) {
实现run()方法 编写线程体 借助Thread类启动线程
for(int i=0;i<5;i++){ System.out.println("MyRunnable类中run方法中的i="+i);
package} cn.sxt.runnable; pub}lic class TestMyRunnable {
} }
实现Runnable接口 package cn.sxt.runnable;
示例16-5
public class MyRunnable implements Runnable {
使用实现Runnable示接例口16实-6现多线程的步@骤Override
编写类实现Runnable接口
public void run() {
多线程
线程的基础知识
程序、进程与线程
进程
程序:是一系列有序的指令集合,由程序员编写、由代码组成,用于让计算机执行一
定的操作或用于实现一定的功能
进程 :启动运行的程序被称为进程,系统会为进程分配一定的内存空间,进程由三部 分组成,分别为cpu、data、code组成
线程:是进程的组成部分,一个进程中有N多个线程,这些线程共享进程的内存资源, 线程负责具体的执行
}
案例:实现Runnable接口编写线程类
案例:借助Thread类启动线程
继承Thpracekagae dcn类.sxt.s与hare;实现Runnable接口的区别
继示J承a例vT1ah6中-r7e的ad类类具实有现pu单多bpl继i线ucb承cs程liluca的ps有Tesi特rc一T(kni点eca定tkmTe,的hetTr)如;eh局ard果e限a(Sd一性trei个nxgt类enna继dms承eT)h{了reaTdh{read类那么就不能再继承其它的类了,所以
创f建orTh(irnetaid对= 0象; ,i <并5给; i+线+程) {起个名字
Thread(Runnable target) Thread(Runnable target, String name)
根据RuSnynsatbelme接.o口ut的.pr实in现tln类("创==建==Th=r=e=a=d=对=象==main中的i=" + i); }
}
TicketThread t3=new TicketThread("C窗口");
}
t1.start();//启动线程,开始售票
看到每个窗口各卖了5张票,3个窗口一共卖了t125.s张ta,rt()产; 生的原因是三个线程类的对象,
每个对象都有一个独立的属性ticket
t3.start(); }
}
继承Thread类与实现Runnable接口的区别
} }
线程的生命周期
新生状态:一个线程类使用new关键字创建完对象,在堆内存开辟内存空间 ,所以说处 于新生状态的线程有自己的内存空间
就绪状态:使用start()方法开始启动线程,那么线程处于就绪状态,处于就绪状态的线 程具备了运行的所有条件,但是还没有得到CPU的调度,通常被称为“万事具备,只欠CPU 调度”,就绪状态的线程具备了运行资格,不具备运行条件
for (int i = 0; i < 100; i++) {
Thread t3=new Thread(tr,"C窗口");
if (ticket > 0) {
t1.start();
System.out.println(Thread.currentTht2r.esatdar(t)(.g);etName() + "卖第" + (ticket--) + "张票");
}
使用Runnable接口p实riv现at多e in线t t程ick的et优=5点; :
避免单继承 @Override
方便共享资源,pu同bl一ic份vo资id源r多un个()代{ 理访问 for(int i=0;i<100;i++){
package cn.sxt.share;
案口例实: 现有三个窗口共卖5}张i}票f(ti,cSkye每st>t个e0m){窗.ou口t.p有ri1nt0l0n个(su人ppue排br.lgic队eTTptciiuNcc,lbakkalseem分icsttTTeTs别hh(et)rra+see使t"taaiT卖cdd用icv第ttko21继e"i==d+tnnT承(meethiwwcraTekihTTnaeriid(tccS-e-kk{t)aree+idttn"TT类张ghh[rr票]和eeaaa"r实)ddg;((s""现)BA{窗 窗Ru口 口n""n))a;; ble接
} public static void main(String[] args) {
构造方法
MyRunnable myRun=n方ew法M参y数Ru描n述nable();
Thread()
创T建hTrheraedadt=对n象ew Thread(myRun); t.start();
Thread(String name)
实现Runnable接口
System.out.println("MyThread中的run方法中的代码");
实现Callable接口
} }
继承Thread类实现多线程的步骤
示例16-2
编写类继承Thread
package cn.sxt.thread;
重写Thread中的run()方法
public class TestMyThread { public static void main(String[] args) {
在run()方法中所编写的代码称为线程M体yThread my=new MyThread(); 案例:继承T运 MmhyyrT.行ehsartJdeaa类arvdta编(程m)写y序 启=线n时 动e程w启my类M动线yT了程hr,Jeaav这da(个虚})拟时之机候前} mS有,有yys.st负两一etamr责个个t.(o)线执线u; t.行程程pri主,,ntl线一线n("个程程---(是的----主主名----线称方---法为程-m),maain中一i方n个的是法中代是主的码m线y代,程线码在,程");执,使行用
public void run() {
for(int i=0;i<10;i++){
案例:线程体中使用循环
System.out.println("MyThread2中的i="+i+"--------------------");}} Nhomakorabea}
案例:示测例试16线-4 程的使用package cn.sxt.thread;
@Override public String call() throws Exception { String [] array={"apple","banana","orange","grape","pear"}; int random=(int)(Math.random()*4)+1; return array[random]; } package cn.sxt.ca}llable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class Test { public static void main(String[] args) throws InterruptedException, ExecutionException { RandomCallable rc=new RandomCallable(); FutureTask<String> ft=new FutureTask<>(rc); Thread t=new Thread( ft );
private int ticket=5;
TicketRunnable tr=new TicketRunnable();
@Override
Thread t1=new Thread(tr,"A窗口");
public void run() {
Thread t2=new Thread(tr,"B窗口");
Java中实现多线程的方式
在Java中实现多线程的示方例式16-有1 三种 继承Thread类
package cn.sxt.thread; public class MyThread extends Thread {
一个普通类继承Thread类,这个类就@p具Ouvb备elircr了ivdoe多id线ru程n()操{ 作的能力
在start()方法Sy之ste前m.,ou任t.p务rin是tln没("任有务完是成否的已完,成因:"为+ 还ft.is没D有on启e()动); 线程,所以isDone()的结果为false, 当使用get()方t.s法tar获t();取到结果后,说明任务已结完成了,因为只有结果出来,任务才能结束,否 则无论get()方SSyy法ssttee后mm..有oouu多tt..pp少rriinn句ttllnn代(("f任码t.g务都et是(不)否);会已完执成行:"+ ft.isDone() );
任务管理器FutureTask是接口RunnableFuture接口的实现类,而RunnableFuture接口又 继承了Future接口和Runnable接口,所以任务管理器类FutureTask也是Runnable接口的实 现类。通过创建任务管理器类的对象将Callable接口的实现类传入,从而实现多线程
}
t3.start();
}
}
}
}
}
实现Callable接口
Callable接口从JDK1.5开始,与Runnable实现多线程相比,Callable支持泛型,call() 方法可以有返回值,而且还支持泛型的返回值,比run()方法更强大的一点是还可以抛出异 常。 Callable接口中的方法call()需要借助FutureTask这个类进行获取结果,使用Callable 接口实现多线程所需要的类与接口之间的关系
案例:线程类由的于使哪用个线程先“抢占”到CPU资源不确定,所以两句代码哪句先执行也不确定
继承Thread类
在线示程例体16中-3 使用循环,pa程cka序ge的c运n.s行xt.效thr果ea会d;更加明显
public class MyThread2 extends Thread {
@Override
程序
线程
线程的基础知识
进程与线程之间的关系
进程与进程之间是相互独立的,都有自己的内存空间 线程之间互相“抢占”CPU资源,CPU在同一个时间片内只能执行一个线程,时间片
结束再调度其它的线程 一个进程中的线程多了,被CPU调度执行的概率就大,所以多线程操作可以提高程
序的运行效率
一个进程中的线程共享代码和数据空间,线程结束,进程不一定结束,但 是进程结束,线程一定结束。进程中包含线程,线程是进程的组成部分。
public class TestMyThread2 { public static void main(String[] args) { MyThread2 my2=new MyThread2();
注如果意使事用项m:y2在.r启un动()线mf那o程yr(么2inS.时st线ytasi使=rt程e0t(用m;)im;<.y是o120u将;Tti.+hp+没rri)en{有atldn被类("=启中==动s=t=,a=r=那t=(=么)==方只==法=有主,一方而个法非中线调的程的用,fro那ur循n就(环)是i方="主法+i),; 线程,程序无论运行} 多少次,结果都相同
实现Callable接口 package cn.sxt.callable;
示案例例16:-9 实现Callable接口ipmu实pboli现rct c多jalav线sas.u程Rtial.ncdoonmcuCrraellnatb.Cleailmlabpllee;ments Callable<String> {
示例16-8
package cn.sxt.share;
package cn.sxt.share;
public class TestTicketRunnable {
public class TicketRunnable implements Runnabplueb{lic static void main(String[] args) {
实现run()方法 编写线程体 借助Thread类启动线程
for(int i=0;i<5;i++){ System.out.println("MyRunnable类中run方法中的i="+i);
package} cn.sxt.runnable; pub}lic class TestMyRunnable {
} }
实现Runnable接口 package cn.sxt.runnable;
示例16-5
public class MyRunnable implements Runnable {
使用实现Runnable示接例口16实-6现多线程的步@骤Override
编写类实现Runnable接口
public void run() {
多线程
线程的基础知识
程序、进程与线程
进程
程序:是一系列有序的指令集合,由程序员编写、由代码组成,用于让计算机执行一
定的操作或用于实现一定的功能
进程 :启动运行的程序被称为进程,系统会为进程分配一定的内存空间,进程由三部 分组成,分别为cpu、data、code组成
线程:是进程的组成部分,一个进程中有N多个线程,这些线程共享进程的内存资源, 线程负责具体的执行