java多线程编程核心技术前夜1

补充回顾:

1.多态:同一个行为具有不同的表现。多态的三个必要条件,继承,重写,父类对象引用指向子类对象。

2.封装:提供一个外部访问,保护内部代码,修改内部代码的同时不影响外部的使用。

一、

1.1start方法,执行顺序:线程的start()方法执行一些线程的初始化工作,并告诉线程调度程序此线程以准备好执行,等待线程调度程序来调度。线程调度程序调用这个线程的时间是不确定的,所以两个线程对象先后执行start()方法,哪个线程对象先执行也是不知的。

1.2thread类:也是一个实现Runnable接口的类。

1.3i++和++i:i++是先进行赋值再自增,++i是先进行自增再进行赋值。这两个操作都不是 原子操作,可以分为三个步骤,取得i的值,对i增加或减少,再对i赋值。在这三个步骤中就可能产生线程安问题。

1.4线程的共享变量:怎么样才能使得多个线程对同一个变量(共享变量)访问呢?声明一个thread对象a。Thread b=new Thread(a,"b");Thread c=new Thread(a,"c");因为thread构造方法有个可以传入thread对象作为参数。这样b、c两个线程共享a线程对象中的变量。

1.5synchronized关键字:使用此关键字可以为一个对象或一个方法加锁,使得多个线程同时访问这个方法或对象的时候,以顺序的形式访问,不会产生线程安全问题。

1.6关于synchronized关键字的使用讲解

1.7System.out.println()方法是同步的:public void println(String s){synchronized(this){print(s);newLine();}}

1.8Thread.currentThread()方法: 返回代码段正在被哪一个线程的信息。

1.9threadobj.isAlive()方法: 判断线程是否处于活动状态。活动状态:线程处于运行或者准备状态。

2.0mythread tt=new mythread();Thread c=new Thread(tt);此时的this.getname()和Thread.currentThread().getname()返回的信息可能不同。因为再c中将传入的tt绑定到一个private target对象中,调用this时指定的就是target对象。而Thread.currentThread().getname()返回的时tt线程对象的信息。详解链接

2.1判断一个线程是否停止:interrupted和isinterrupted。这两个方法的区别第一个方法是一个静态方法,并且第一此调用interrupted方法后会将线程的状态置为false,也就是说你第二次再调用这个方法的时候返回的是false。isinterrupted则不会重置线程的状态。

2.2如果一个线程在sleep中进行终止。则会进入interrupted异常,并执行异常语句块执行。反之一个线程先进行中断在进行睡眠也会产生异常。

2.3调用stop()方法: 会强制的停止线程,但是这个方法不推荐,因为这个方法会使一些清理不能进行,还会出现释放锁,导致数据不一致的结果。

2.4方法suspend(): 能够暂停线程,但是暂停线程后并不释放线程所占用的公共资源的锁。

2.5方法suspend()和resume()方法: 被废弃的原因是因为这两个方法会导致数据的不同步,根本原因是不能释放公共资源锁。

2.6yield()方法:暂时释放cup资源,放弃的时间点是不确定的。获得的时间也是不确定的。可能刚放弃立马就获得了cpu资源。

2.7优先级:在java中,优先级是由1-10的数字表示,数字越大优先级越高,优先级越高cpu分配给这个线程的执行资源就越多,也就意味着一般此线程会先执行玩。MIN_PRIOTITY=1,NORM_PRIORITY=5,MAX_PRIORITY=10。如果设置优先级小于1或则大于10将会抛出异常。

2.8获取当前系统时间:system.currentTimeMillis()方法。

2.9java中线程的优先级是具有继承性的,A线程是什么优先级,由A线程创建的线程就是什么优先级。

3.0

猜你喜欢

转载自blog.csdn.net/BIGSEACOMING/article/details/80317772