Java多线程编程核心技术-笔记-第一章

来源:互联网 发布:巨库软件 编辑:程序博客网 时间:2024/05/16 05:24

第一章 Java多线程技能

1.1 进程和多线程的概念及线程的优点

完全可以将运行在内存中的exe文件理解成进程,进程是受操作系统管理的基本单元。

线程可以理解成是在进程中独立运行的子任务。比如,QQ.exe运行时就有很多的子任务在同时运行。比如,好友视频线程、下载文件线程、传输线程、发送表情线程等。

为什么需要线程?可以最大限度地利用cpu的空闲时间来处理其他的任务。

如果两个任务顺序执行,第一个任务需要等待远程服务器返回数据,这时cpu一直处于等待状态,一直在“空运行”。如果第二个任务需要执行的时间很短,那也得等第一个任务执行完,才能得到cpu资源。如果使用多线程,就可以给第二个任务开一个线程,第二个任务很快就可以执行完。

1.2 使用多线程

使用继承Thread类的方式创建线程,最大的局限就是不支持多继承。如果需要多继承,可以实现Runnable接口的方式,一边实现一边继承。这两种方式创建的线程在工作时的性质是一样的,没有本质区别。

在使用多线程技术时,代码的运行结果与代码执行顺序或调用顺序是无关的。

线程是一个子任务,cpu以不确定的方式,或者说是以随机的时间来调用线程中的run方法。

Thread.java类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用对象的run()方法。

Start()方法的顺序不代表线程启动的顺序。

Thread.java类也实现了Runnable接口,那也就意味着构造函数Thread(Runnable target)不光可以传入Runnable接口的对象,还可以刻传入一个Thread类的对象,这样做完全可以将一个Thread对象中的run()方法交由其他的线程进行调用。

通过在run()方法前加入synchronized关键字,使多个线程在执行run方法时,以排队的方式进行处理。当一个线程调用run前,先判断run方法有没有上锁,如果上锁,说明其他线程正在调用run方法,必须等其他线程对run方法调用结束后才可以执行run方法。这样也就实现了排队调用run方法的目的。Synchronized可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。

非线程安全是指多个线程对同一对象中的同一实例变量进行操作时会出现值被更改、值不同步的情况。

currentThread()方法可返回代码段正在被哪个线程调用的信息。

Thread.currentThread()和this.currentThread()在大部分情况下结果是相同的,都是调用Thread的静态方法currentThread(),若当前子类重写了父类的currentThread()方法,那么Thread.currentThread()和this.currentThread()返回的结果会不同。


线程优先级有助于帮“线程规划器”确定在下一次选择哪一个线程来优先执行。

线程优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A是一样的。

任何一个守护线程都是整个JVM中所有非守护线程的“保姆”,只要当前JVM实例中存在任何一个非守护线程没有结束,守护线程就在工作,只有当最后一个非守护线程结束时,守护线程才随着JVM一同结束工作。守护线程最典型的应用就是GC。


阅读全文
0 0