AP计算机科学A(APcomputer science A)复习备考攻略视频教程
43754 人在学
线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIXThread;或者由内核与用户进程,如Windows7的线程,进行混合调度。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(callstack),自己的寄存器环境(registercontext),自己的线程本地存储(thread-localstorage)。
stop()已经过时.
停止线程:run()方法结束。
开启多线程运行,通常代码都是循环结构。
只要控制住循环,就可以让run()结束,也就结束了线程。
classStopThreadimplementsRunnable{
privatebooleanflag=true;
@Override
publicvoidrun(){
while(flag){
System.out.println(Thread.currentThread().getName()+"...run");
}
}
publicvoidchangeFlag(){
flag=false;
}
}
publicclassStopThreadDemo{
publicstaticvoidmain(String[]args){
StopThreadst=newStopThread();
Threadt1=newThread(st);
Threadt2=newThread(st);
t1.start();
t2.start();
intnum=0;
while(true){
if(num++==60){
st.changeFlag();
break;
}
System.out.println(Thread.currentThread().getName()+"......"+num);
}
}
}
特殊情况:当线程处于冻结状态就不会读取到标记,那么线程也就不会结束。
当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到运行状态中来,这样就可以操作标记让线程结束。
Thread类中提供了该方法:interrupt();
classStopThreadimplementsRunnable{
privatebooleanflag=true;
@Override
publicsynchronizedvoidrun(){
while(flag){
try{
wait();
}catch(InterruptedExceptione){
System.out.println(Thread.currentThread().getName()+"...Exception");
flag=false;
}
System.out.println(Thread.currentThread().getName()+"...run");
}
}
publicvoidchangeFlag(){
flag=false;
}
}
publicclassStopThreadDemo{
publicstaticvoidmain(String[]args){
StopThreadst=newStopThread();
Threadt1=newThread(st);
Threadt2=newThread(st);
t1.start();
t2.start();
intnum=0;
while(true){
if(num++==60){
//st.changeFlag();
t1.interrupt();
t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+"......"+num);
}
System.out.println("over");
}
}
在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。