Java 多线程

多线程

9.1 进程与线程

进程是程序的一次动态执行过程,从代码加载,执行到执行完毕的完整过程。

多线程是实现并发机制的一种有效手段。

多线程是指一个进程在执行过程中可产生多个更小的程序单元(线程),这些线程可同时存在,同时运行,而一个进程可能包括多个同时执行的线程。

9.2 Java中线程的实现

继承Thread类

class 类名称 extends Thread{
属性...;
方法...;
public void run(){
线程主体
}
}

为什么启动线程不能直接使用run()方法?
答:线程的运行需要本机操作系统支持

哪个线程对象抢到了CPU资源,哪个线程就先可以运行。

只可调用一次start()
调用多次抛出“IllegalThreadStateException”

实现Runnable接口

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()方法。

Runnable比Thread类显著优势

  1. 适合多个相同程序代码的线程去处理同一资源的情况。
  2. 可以避免由于Java的单继承特性所带来的局限。
  3. 增加了程序的健壮性,代码能被多个线程共享,代码与数据是独立的。

利用Callable接口实现多线程

可返回操作结果

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 方法返回值 方法名称(参数列表){
//方法体
}

多个线程共享同一资源时需要进行同步,以保证资源操作的完整性,但是过多的同步就有可能产生死锁。

面试:
请解释多线程访问同一资源时需要考虑哪些情况?有可能带来哪些问题?

  1. 多线程访问同一资源时,考虑数据操作的安全性问题,一定要使用同步操作。
  2. 过多的同步操作有可能会带来死锁问题,导致程序进入停滞状态。

Object类对线程的支持———等待与唤醒

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()后结束等待

重点

  1. 线程是指程序的运行流程。"多线程"的机制可以同时运行多个程序块,使程序运行的效率更高,也解决了传统程序设计语言所无法解决的问题
  2. Thread子类,线程的处理必须编写在run()里
  3. Thread子类覆写run()
  4. Runnable接口声明了抽象run()方法,实现该接口必须写run()方法
  5. Callable接口,在线程操作执行完返回相应的结果
  6. 创建 -> 就绪 -> 运行 -> 阻塞 -> 终止
  7. 暂停:该线程调用对象的wait(), 本身调用sleep(), 和另外一个线程join()在一起时
  8. 冻结消失: notify();sleep()时间到了。
  9. 消亡状态:run()结束或线程调用了sleep()
  10. Thread类sleep()控制休眠状态
  11. 强制运行某一线程,join()
  12. join()方法抛出InterruptedException,必须写在try…catch中
  13. 多个线程对象操作同一共享资源时,要使用synchronized进行资源的同步处理

你可能感兴趣的:(java,多线程)