开始重新学习并发,虽然以前也没怎么好好学........准备看java核心技术卷一来自学
so,首先,需要了解多线程和多进程之间的区别,多进程的进程数目并不由CPU数目制约,而是操作系统将CPU的时间分配给进程,
多线程则在较低的层次上扩展了多任务的概念,一个程序可以同时处理多个任务,则每个任务为一条线程。
进程和线程的本质区别:每个进程拥有自己的一整套变量,而线程则共享数据
同时,线程更轻量级,创建,撤销一个线程比启动新进程的开销小很多
1.认识Thread
1.1 Thread实现了Runnable接口
Runnable
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
Runnable很简单,只有一个函数run(),是一个函数式接口
Thread的构造方法
Thread()
分配新的 Thread 对象。
Thread(Runnable target)
分配新的 Thread 对象。
Thread(Runnable target, String name)
分配新的 Thread 对象。
Thread(String name)
分配新的 Thread 对象。
Thread(ThreadGroup group, Runnable target)
分配新的 Thread 对象。
Thread(ThreadGroup group, Runnable target, String name)
分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小。
Thread(ThreadGroup group, String name)
分配新的 Thread 对象。
emmm,我就用过前两个,监介
接下来是Thread的常见方法
static void sleep(long millis)
void start()
void run()
static void yield()
暂停该线程,并执行其他线程
void join()
等待该线程终止
public final boolean isDaemon()
void interrupt()
向线程发送中断请求,线程的中断状态被设置为true,若当前线程被一个sleep调用阻塞,那么会抛出异常
static boolean interrupted()
boolean isInterrupted()
static Thread currentThread()
Thread.State getState()
2.线程状态
- New(新创建,但还未运行,new Thread())
- Ruunable(调用了start()方法,一个可运行的线程可能在运行也可能没在运行,取决于操作系统给线程提供的运行时间)
- Blocked(当一个线程试图调用一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态)
- Waiting(当线程调用sleep()或wait(),或者等待concurrent库中的Lock或Condition时,就会进入等待状态)
- Timed Waiting(当等待状态有一个超时参数时,就是计时等待状态)
*Terminated(1.run()方法正常退出 , 2.因为一个没有捕获的异常终止了run()方法)