进程是程序的一次动态执行过程,从代码加载,执行到执行完毕的完整过程。
多线程是实现并发机制的一种有效手段。
多线程是指一个进程在执行过程中可产生多个更小的程序单元(线程),这些线程可同时存在,同时运行,而一个进程可能包括多个同时执行的线程。
继承Thread类
class 类名称 extends Thread{
属性...;
方法...;
public void run(){
线程主体
}
}
为什么启动线程不能直接使用run()方法?
答:线程的运行需要本机操作系统支持
哪个线程对象抢到了CPU资源,哪个线程就先可以运行。
只可调用一次start()
调用多次抛出“IllegalThreadStateException”
class 类名称 implements Runnable{
属性...;
方法...;
public void run(){
线程主体;
}
}
Thread a=new Thread(Runnable target);
Thread b=new Thread(Runnable target, String name);//name:该线程的名字
Thread类是Runnable接口的子类。
通过Thread类实现多线程必须覆写run()方法。
可返回操作结果
public interface Callable{
public V call() throw Exception;
}
public class FutureTask
extends Object
implements RunnableFuture
FutureTask常用方法:
public FutureTask(Callble callable)
public FutureTask(Runnable runnable,V result)
public V get() throws InterruptedException,ExecutionException
线程操作的相关操作
取得线程名字:getName();
设置线程名字:setName();
默认名字:Thread-XX
Java程序每次运行至少启动几个线程?
答:两个,main线程,垃圾收集线程。
判断线程是否启动,且仍在运行:isAlive();
主线程可能比其他线程先执行完。
强制运行:join();
休眠:Thread.sleep();
中断:interrupt();
后台线程:setDaemon();
public static final int MIN_PRIORITY
public static final int NORM_PRIORITY
public static final int MAX_PRIORITY
setPriority()
getPriority()
线程的礼让
yield();//先让其他线程进行,本线程暂停。
同步代码块
synchronized(同步对象){
需要同步的代码块;
}
同步方法
public synchronized 方法返回值 方法名称(参数列表){
//方法体
}
多个线程共享同一资源时需要进行同步,以保证资源操作的完整性,但是过多的同步就有可能产生死锁。
面试:
请解释多线程访问同一资源时需要考虑哪些情况?有可能带来哪些问题?
public final void wait() throws InterruptedException
public final void wait(long timeout) throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
public final void notify()
public final void notifyAll()
sleep()和wait()的区别:
sleep() 线程休眠 Thread类 到时即恢复
wait() 线程等待 Object类 到执行notify() notifyAll()后结束等待