多线程第一章知识点

来源:互联网 发布:传奇h5修改数据库教程 编辑:程序博客网 时间:2024/06/16 01:46
/**
* 进程:是一次程序的执行,是系统进行资源分配和调度的一个独立单位
* 线程:在进程中独立运行的子任务
* 单线程同步,多线程异步
* public class Thread implements Runnable在创建thread对象时可以传入一个Runnable接口;即用接口创建一个实现类的对象,创建Thread时,把这个实现类的对象穿进去即可。
* public class MyThread extends Thread:创建一个类继承Thread,然后重写run()方法,在其他类中调用这个类的start()方法;其实Thread类里面是实现了Runnable接口的代码的运行结果与代码执行顺序或调用顺序无关
*/
/**
* synchronized可以在任意对象及方法上加锁,加锁的这段代码称为“互斥区”或“临界区”
* 留意i--与System.out.println()的异常,println()方法内部是同步的,但是i--的操作却是在进入println()之前发生的
* Thread.currentThread().getName()获取当前线程的名字;this.getName()获取当前对象的名字,默认为Thread-0
* isAlive()方法判断当前的线程是否处于活动状态:已经启动且尚未终止 (注意Thread.CurrentThread()和this的区别,记录在书上了)
* getId()获取线程的唯一标识
*停止线程方式:1:Thread.stop(),但是这个方法不安全,已废弃;无法进行清理工作;数据得不到同步的处理,出现数据不一致的问题
*    2:Thread.interrupt(),这个方法不会终止一个正在运行的线程,只是在当前线程中打了一个停止的标识,还需要加入一个判断才可以完成线程的停止
*         3:使用退出标志,使线程正常退出,即当run()方法完成后线程终止  
*/
/**
*判断线程是否是停止状态
*this.interrupted() (静态方法)测试当前线程是否已经中断,当前线程是指运行this.interrupted()方法的线程,线程的中断状态由该方法清除,换句话说,
*                   如果连续两次调用该方法,则第二次调用将返回false(第一次调用已清除了其中断的状态)(主线程调用Thread.interrupt()方法,
*                   在新启的线程中调用this.interrupted()方法判断线程是否停止即可停止线程,但是不会停止for语句下面的语句,
*                   这种情况可以在if语句里面抛一个异常然后抓这个异常就可以了)
*this.IsInterrupted()(非静态方法)测试线程是否已经中断,但不清除状态标志 
*在沉睡中停止:如果在sleep状态下停止一个线程,会进入catch语句,并清除停止状态值,使之变为false
*/
/**
* 使用return和interrupt()结合也能实现停止线程:主线程调用interrupt()方法,子线程调用this.interrupted()方法,然后return
* 建议:还是使用“抛异常”法来实现线程的停止,因为在catch块中可以对异常信息进行相关的处理,若多个return会造成污染
*/
/**
* 暂停线程:使用suspend()方法暂停线程,使用resume()方法恢复线程的执行(已废弃)
* 缺点1:很容易造成公共的同步对象的独占,使其他线程无法访问公共同步对象
* 缺点2:不同步,很容易出现因为线程的暂停而导致数据不同步的情况
*/
/**
* yield()方法:放弃当前cpu资源(放弃时间片),让给其他的任务,但放弃的时间不一定,有可能刚刚放弃又马上获取时间片
*/
/**
* 线程可以划分优先级,优先级较高的线程得到的CPU资源较多,CPU优先执行优先级较高的线程对象中的任务
* Thread.setPriority()方法设置优先级(1--10),10最高,且线程的优先级具有继承性,例如A线程启动B线程,B和A的优先级是一样的
* 假设在main(优先级为5)线程中启动了线程1,则线程1和main线程具有一样的优先级
* 高优先级的线程总是大部分先执行完,与代码的执行顺序无关,优先级具有随机性(优先级较高的线程不一定每次都先执行完,例如优先级5和6)
*/
/**
* java中的线程分为两种:
* 1: 用户线程
* 2:守护线程:当线程中不存在非守护线程了,则守护线程也自动销毁,例如:垃圾回收线程;守护线程的作用就是为其他线程提供便利服务,最典型的GC(垃圾回收器)
*/
/**
* synchronized锁定的一个对象,不是锁定代码块;相当于厕所的门,不可能每个人都访问;如果想要访问他,先去堆内存里面申请访问这个锁,如果第二个线程想要访问这个对象,就得等着第一个线程释放掉这个锁,这种锁叫互斥锁
* synchronized用在静态方法上相当于类.class
* synchronized(Test.class){//Test.class表示Class类的对象,这个地方不可以把Test.class替换成this,因为静态的属性和方法不需要new出对象来访问的;相当于访问了synchronized的静态方法一样,是对类加锁
*/
原创粉丝点击