chapter-1
一,Thread类的API回顾
1,实现多线程的方式有两种:实现Thread类,另一种是实现Runnable接口
Thread.java类中的start()方法通知“线程规划器”此线程已经准备好了,等待调用线程的对象的run()方法,使得线程得到运行,其效果是异步执行效果;
如果调用代码thread.run()就不是异步执行了,而是同步 ,那么线程对象并不交给“线程规划器”来处理,而是由main主线程来调用run()方法,也就是等run()方法中的代码执行完后才可以执行后面的代码。
二,线程安全问题
1,通过在run方法前面加入synchronized关键字,使多个线程在执行run方法时,以排队的方式进行处理。{“非线程安全”--->
(主要是指多个线程对同一个对象中的同一个实例对象进行操作时会出现值被更改,值不同步的情况,进而影响程序的执行流程)}
2,留意 i-- 与system.out.println()的异常
class MyThread extends Thread{
private int i=5;
@Override
synchronized public void run(){
super.run();
System.out.println("i="+(i--)+"threadName="+Thread.currentThread().getName());
}
}
class Run{
public static void main(String[] a){
MyThread run=new MyThread();
Thread t1=new Thread(run);
Thread t2=new Thread(run);
Thread t3=new Thread(run);
Thread t4=new Thread(run);
t1.start();
t2.start();
t3.start();
t4.start();
}
}//程序运行的结果会出现:i的值跟线程的名不对应的情况
3,currentThread()方法:返回的是代码段正在被那个线程调用的信息
class MyThread extends Thread{
@Override
synchronized public void run(){
super.run();
System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
System.out.println("this.currentThread().getName()="+this.currentThread().getName());
}//这两个输出语句所输出得到的线程名是不一样的,Thread对象得到的是main函数这个名字,而this对象得到的是其所引用的线程名
}
4,,isAlive()方法:是判断当前的线程是否处于活动状态
5,geiId()方法:是取得线程的唯一标识
三,停止线程
1,有三种方法停止线程{
1)使用退出标志,使线程正常退出 (如:使用 return 关键字来退出线程)
2)使用 stop()方法,但是不推荐使用,stop和suspend和resume都是作废过期的方法{如果要用stop()方法,它会抛出java.lang.ThreadDeath异常,此异常不需要显示的捕捉}
3)使用interrupt()方法,但是interrupt()方法使用的效果不想 for+break语句那样,马上就停止循环,这个方法只是相当于在当前线程中打了一个停止的标志,并不是真的停止线程
}
2,判断线程是否是停止状态有两种方法:
1)this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志置清除为false的功能
2)this.isInterrupted():测试线程是否已经是中断状态,但不清除状态标志
3,停止线程的三种方法详解:
1)异常法
class MyThread extends Thread{ //这一段代码会由于异常的出现而结束线程!
@Override
synchronized public void run(){
super.run();
try{
for(int i=0;i<500000;i++){
if(this.interrupted()){
System.out.println("已经是停止状态了!我要退出啦!");
throw new InterruptedException();
}
System.out.println("i="(i+1));
}
System.out.println("我在for下面");
}catch(InterruptedException e){
System.out.println("进去MyThread.java类中的catch了!");
e.printStackTrace();
}
}
}
2)
3)