一、认识:
1、概念介绍:
进程:进程指正在运行的程序。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的。
单线程程序:若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。
多线程程序:若有多个任务可以同时执行。
2、创建线程方法:
2.1 继承 Thread 类 (Thread 类本质上是实现了 Runnable 接口的一个实例)
创建类继承 Thread 类, 重写run方法,
启动线程的唯一方法就是通过 Thread 类的 start()实例方法。它将启动一个新线程,并执行 run()方法
public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()"); } } //调用 MyThread myThread1 = new MyThread(); myThread1.start(); |
2.2实现 Runnable 接口
创建类实现 Runnable 接口, 重写run方法,
public class MyThread implements Runnable { public void run() { System.out.println("MyThread.run()"); } } /调用 //启动 MyThread,需要首先实例化一个 Thread,并传入自己的 MyThread 实例: MyThread myThread = new MyThread(); Thread thread = new Thread(myThread); thread.start(); |
2.3实现Callable接口 (有返回结果的多线程)
创建类实现 Callable 接口, 重写call方法,
public class ThreadPoolCallable implements Callable{ public String call(){ return "abc"; } } //调用 ThreadPoolCallable t1 = new ThreadPoolCallable() String s=t1.call(); System.out.println(s); |
线程基本方法:
线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等。
线程等待(
wait
)
调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的
是调用 wait()方法后,
会释放对象的锁
。因此,wait 方法一般用在同步方法或同步代码块中。
线程睡眠(
sleep
)
sleep 导致当前线程休眠,与 wait 方法不同的是
sleep 不会释放当前占有的锁
,sleep(long)会导致
线程进入
TIMED-WATING
状态,而
wait()方法会导致当前线程进入 WATING
状态
线程让步(
yield
)
yield 会使当前线程
让出 CPU 执行时间片
,与其他线程一起重新竞争 CPU 时间片。一般情况下,
优先级高的线程有更大的可能性成功竞争得到 CPU 时间片,但这又不是绝对的,有的操作系统对
线程优先级并不敏感。
Join
等待其他线程终止
join() 方法,等待其他线程终止
,在当前线程中调用一个线程的 join() 方法,则当前线程转为阻塞
状态,回到另一个线程结束,当前线程再由阻塞状态变为就绪状态,等待 cpu 的宠幸。
为什么要用
join()
方法?
很多情况下,主线程生成并启动了子线程,需要用到子线程返回的结果,也就是需要主线程需要
在子线程结束后再结束,这时候就要用到 join() 方法。
System.out.println(Thread.currentThread().getName() + "线程运行开始!");
Thread6 thread1 = new Thread6();
thread1.setName("线程 B");
thread1.join();
System.out.println("这时 thread1 执行完毕之后才能执行主线程");
线程唤醒(
notify
)
Object 类中的 notify() 方法,
唤醒在此对象监视器上等待的单个线程
,如果所有线程都在此对象
上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发生,线程通过调
用其中一个 wait() 方法,在对象的监视器上等待,
直到当前的线程放弃此对象上的锁定,才能继
续执行被唤醒的线程
,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞
争。类似的方法还有 notifyAll() ,唤醒再次监视器上等待的所有线程。
其他方法:
1. sleep():强迫一个线程睡眠N毫秒。
2. isAlive(): 判断一个线程是否存活。
3. join(): 等待线程终止。
4. activeCount(): 程序中活跃的线程数。
5. enumerate(): 枚举程序中的线程。
6. currentThread(): 得到当前线程。
7. isDaemon(): 一个线程是否为守护线程。
8. setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线
程依赖于主线程结束而结束)
9. setName(): 为线程设置一个名称。
10. wait(): 强迫一个线程等待。
13/04/2018
Page 75 of 283
11. notify(): 通知一个线程继续运行。
12. setPriority(): 设置一个线程的优先级。
13. getPriority()::获得一个线程的优先级。