1、 为什么要使用多线程?
单个线程可以同时运行多个不同的线程,执行不同的任务(在相同的时间段内执行不同的任务)
使用动机如: 使UI响应更快,利用多处理器系统,简化建模、执行异步或者后台处理等等
2、 线程的状态
初始状态New——就绪状态start——运行状态run——阻塞状态{wait,锁,sleep}——结束状态
3、 建议使用Runnable实现多线程,最终都是通过调用thread.start()来使用线程处于可运行状态。
4、 方法start():无需等待run()方法体执行完毕而直接继续执行下面的代码;
run()类的一个普通方法,还是在主线程里执行调用,如果直接调用则没意义了
5、 Timer和TimerTask的使用
每个Timer对象都对应一个后台线程,TimeTask是一个抽象类,实现了runnable接口,它的子类代表一个可以被Timer计划的任务。适用于轻量级的定时功能,但其时效性效果并不是特别强
Timer类的两个主要方法:schedule(...)时间间隔稳定性scheduleAtFixedRate(...)频率稳定性。
Timer的终止方法:{调用cancel,将timer设为daemon,置timer的引用为null,调用System.exit()方法)
JDK1.5以上建议少用Timer、TimerTask,而多使用ScheduledThreadPoolExector
Callable/Future、 ExectorService等东东(下一部分会介绍)
多线程编程的要点:
线程间的通讯、并发控制、资源的共享与释放等
注意点:
1/ java编写的程序都运行在JVM中,在JVM内部程序的多任务是通过线程来实现的。没启动一个Java应用程序则会启动一个JVM进程,在同一个JVM中有且只有一个进程那就是它自己。
2/ 每个线程都可以被标记为一个守护线程,当某个线程中运行的代码创建一个新Thread对象时,该线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时新线程才是守护线程。
3/ JVM推出的情况: 、
4/ 事实上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的,因此,只有乱序执行的代码才有必要设计为多线程。
熟悉Thread类的API是进行多线程编程的基础
实现runnable进行多线程编程的好处是适于多继承与共享变量
单个线程可以同时运行多个不同的线程,执行不同的任务(在相同的时间段内执行不同的任务)
使用动机如: 使UI响应更快,利用多处理器系统,简化建模、执行异步或者后台处理等等
2、 线程的状态
初始状态New——就绪状态start——运行状态run——阻塞状态{wait,锁,sleep}——结束状态
3、 建议使用Runnable实现多线程,最终都是通过调用thread.start()来使用线程处于可运行状态。
4、 方法start():无需等待run()方法体执行完毕而直接继续执行下面的代码;
run()类的一个普通方法,还是在主线程里执行调用,如果直接调用则没意义了
5、 Timer和TimerTask的使用
每个Timer对象都对应一个后台线程,TimeTask是一个抽象类,实现了runnable接口,它的子类代表一个可以被Timer计划的任务。适用于轻量级的定时功能,但其时效性效果并不是特别强
Timer类的两个主要方法:schedule(...)时间间隔稳定性scheduleAtFixedRate(...)频率稳定性。
Timer的终止方法:{调用cancel,将timer设为daemon,置timer的引用为null,调用System.exit()方法)
JDK1.5以上建议少用Timer、TimerTask,而多使用ScheduledThreadPoolExector
Callable/Future、 ExectorService等东东(下一部分会介绍)
多线程编程的要点:
线程间的通讯、并发控制、资源的共享与释放等
注意点:
1/ java编写的程序都运行在JVM中,在JVM内部程序的多任务是通过线程来实现的。没启动一个Java应用程序则会启动一个JVM进程,在同一个JVM中有且只有一个进程那就是它自己。
2/ 每个线程都可以被标记为一个守护线程,当某个线程中运行的代码创建一个新Thread对象时,该线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时新线程才是守护线程。
3/ JVM推出的情况: 、
4/ 事实上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的,因此,只有乱序执行的代码才有必要设计为多线程。
熟悉Thread类的API是进行多线程编程的基础
实现runnable进行多线程编程的好处是适于多继承与共享变量