线程是什么?
线程是进程内的执行单元。因为进程的转换往往需要耗费很大的资源,所以线程的引入加大了程序的运行速度。现在的进程只作为资源的拥有者,而线程作为资源的调度和分配的基本单元。
线程的基本操作:
新建线程:
Thread t1 = new Thread();
Thread t2 = new Thread(new Runnable());
线程启动:
t1.start(); 启动的是线程内的run()方法,所以我们的代码都要在run()方法里进行重写。
线程终止:
Thread.stop() 不推荐使用,它会释放掉所有的monitor
线程中断:
public void Thread.interrupt() //中断线程
public boolean Thread.isInterrupted() //判断线程是否被中断
public static boolean Thread.interrupted //判断线程是否被中断,并清除当前中断状态
线程运行:
Thread.join() //等待线程结束再运行,在有多个线程时,需要考虑到数据执行
Thread.yeild() //谦让,释放当前资源,并重新参与竞争
Thread.sleep(time) //休眠time时间,不释放资源,等待time时间结束后继续运行
守护线程:
Thread t =new DaemonT();
t.setDaemon(true);
t.start()
//守护线程为jvm控制,如垃圾回收线程,JIT线程等,当程序内只有守护线程时,Java虚拟机就会自然退出
线程优先级:
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
Thread t1 = new Thread();
t1.setPriority(Thread.MAX_PRIORITY);
线程的同步操作:
syschronized
--指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁。
--直接作用于实例方法:相当于对当前实例加锁(即 new一个另外的实例无效),进入同步代码前要获得当前实例的锁。
--直接作用于静态方法:相当于对当前类加锁(即new一个新的实例同样有效),进入同步代码前要获得当前类的锁。
Object.wait() //线程等待,注意即使被唤醒后在进入线程前要获得相应的对象锁。
Object.notify() //随机唤醒在当前对象所等待的一个线程,假如执行唤醒操作后,还是没有释放当前的对象的话(比如执行了sleep操作 ),被唤醒的线程也同样执行不了,因为无法获取到相应的对象锁。
Object.notifyAll() //唤醒所有在当前对象上等待的线程,再让他们去竞争这个对象锁。