继承Thread,或者实现Runnable接口
(通常选择实现Runnable接口,可以多继承,可以方便的数据共享)
继承Thread:
覆写run()方法,然后thread.start();启动多线程
实现Runnable接口:
覆写run()方法,然后new Thread(r).start();启动多线程
(用Thread包装Runnable实例来进行启动)
Callable和FutureTask
因为Runnable的run()方法不能返回结果,所以多了一个Callable类,它的call()方法可以返回结果;
而FutureTask类可以包装Callable的子类,通过FutureTask的get()方法获取call()的返回的值
(Callable胜在有返回值,正常使用推荐Runnable类)
线程的五种状态
创建状态:创建一个线程对象时
就绪状态:start()让线程进入就绪状态
运行状态:线程分配到处理器资源,开始执行run()方法的时候
堵塞状态:因特殊状况,线程让出处理器资源并暂停执行的时候,sleep(),suspend(),wait()会让线程堵塞
终止状态:run()方法执行完毕,或者调用了stop()方法
取得当前线程的方法和设置线程名的方法
currentThread();取得当前运行的线程对象
构造方法Thread()第二个参数设置线程名
setName(),getName();这两个方法设置线程名,取得线程名
线程休眠
sleep()方法,单位是ms毫秒
线程优先级
最高10,中等5,最低1,也可以自己设置数值
setPriority(int);getPriority();
(主方法也是一个线程,它的优先级是5)
同步与异步
同步:等待程序执行完成返回结果进行下一步操作(例如2个卖票员不能同时卖第8张票,一个卖完第八张,另一个卖第九张)
异步:不等待程序执行完毕就去进行下一步操作(例如用浏览器一边下载软件,一边浏览网页)
java多线程同步的方法:
1.synchronized包装的代码块
public void run(){
for(int i=0;i<50;i++){
synchronized(this){
doSomething;
}
}
}
2.synchronized定义的方法
public void run(){
for(int i=0;i<50;i++){
this.method();
}
}
public synchronized void method(){
doSomething;
}
死锁
程序A等待程序B的一个步骤完成,程序B等待程序A的一个步骤完成,程序陷入死锁状态
(对同一资源进行操作要用同步)
(过多的使用同步可能会造成死锁)
线程的等待和唤醒
Object类的wait()和notify(),notifyAll()
wait()使线程进入等待
notify()唤醒第一个进入等待的线程,notifyAll()唤醒所有等待的线程
三个过时的方法
suspend()线程挂起
resume()恢复挂起的线程
stop()停止线程
主要是因为这三个方法的使用会造成死锁,所有不被推荐使用
线程的停止可以覆写stop方法,利用flag标志位的方法来达到执行完run()方法来停止线程
java中的进程
每一个JVM运行就是一个进程,java命令执行一个类就启动了一个JVM(java虚拟机),主方法是其中一个线程,一个类执行完毕,该进程就自动消失
线程池
用于多线程并发
(未完代写)
(请先自行百度该块内容)