1.创建线程
继承Thread类,重写run方法;(run方法不能抛出异常,因为Thread类的run方法没有抛出异常)
实现Runnable接口,实现run方法;
2.执行线程
创建Thread实现类对象,调用start()方法启动线程(方式一);
创建Thread实现类对象,把Runnable实现类的对象作为参数传递,调用Thread对象的start()方法;
3.常用方法
Thread(String name) 初始化线程的名字
getName() 返回线程的名字
setName(String name) 设置线程对象名
sleep() 线程睡眠指定的毫秒数(静态方法,调用该方法的线程睡眠)
currentThread() 返回CPU正在执行的线程的对象(静态方法,返回调用该方法的线程对象)
getPriority() 返回当前线程对象的优先级 默认线程的优先级是5
setPriority(int newPriority) 设置线程的优先级,虽然设置了线程的优先级,但是具体的实现取决于底层的操作系统的实现(最大的优先级是10 ,最小的1 , 默认是5)。
4.线程安全
同步代码块
sychronized(锁对象){
需要被同步的代码
}
锁对象可以是任意对象;
sleep方法不会释放锁;
锁对象必须是共享的对象;
同步函数
用sychronized修饰函数;
非静态的同步函数的锁对象是this对象;
静态的同步函数的锁对象是所属类的字节码文件(class对象)
5.wait和notify
wait和notify方法是属于Object对象的;
wait和notify方法必须要在同步代码块或者是同步函数中才能使用;
wait和notify方法必须由锁对象调用;
wait():一个线程如果执行了wait方法,那么该线程就会进入一个以锁对象为标识符的线程池中等待,并释放持有的锁;
notify():一个线程如果执行了notify方法,那么该线程就会唤醒以锁对象为标识符的等待线程中的一个;
6.interrupt
和notify比较,interrupt是由线程对象调用的,而不是由锁对象调用的,这样可以指定要终止的线程,并且interrupt方法会抛出一个InterruptException异常。
7.守护线程
守护线程随着主程序的存在而存在,随主程序的停止而停止。
设置守护线程setDeamon
8.join
加入所在的线程。并且必须等待该线程支撑完毕才能继续执行下面的语句。