Java多线程学习
Java多线程学习
一、Thread类常见API
-
创建线程
-
继承Thread类,重写run方法
public class MyThread extends Thread{ @Override public void run() { System.out.println(); } }
-
实现Runnable接口,重写run方法
public class MyRunnable implements Runnable { @Override public void run() { System.out.println(); } }
-
-
启动线程
实例化线程对象,使用start()方法启动
Thread thread1 = new MyThread(); thread1.start(); Runnable runnable = new MyRunnable(); Thread thread2 = new Thread(runnable); thread2.start();
-
i-- 和println()
- i--不是线程安全的,赋值操作不是原子性的
- println()方法内部是synchronized修饰,所以是可同步的
-
currentThread()方法和this
- currentThread()方法表示执行当点代码段的线程
- this表示的是当前对象的线程
-
线程A委托线程B执行
MyThread a = new MyThread(); Thread b = new Thread(a); b.start(); //此时,两者有相同的优先级
-
isAlive()方法
当前线程是否活动状态
-
sleep(毫秒)方法
在毫秒内当前线程暂停执行
-
getId()方法
获取线程唯一标识
-
interrupt()方法
中断线程,但是不会真的停止,需要配合interrupted()或isInterrupted()方法来判断停止
-
interrupted()方法
测试当前线程是否中断,并清除中断状态
-
isInterrupted()方法
测试线程对象是否中断,不清除中断状态
-
异常停止法,renturn法
interrupt()中断后,用interrupted()判断,中断,则抛出InterruptedException异常退出,或者使用return退出run方法
-
在沉睡种中中断,在中断中沉睡,都会抛出中断异常
-
stop()方法
此方法会暴力停止线程,造成释放锁的不良后果
此方法会抛出ThreadDeath异常,但是通常不需要显式的捕捉
-
suspend()和resume()方法
暂停线程和恢复线程
已经不再使用,因为会造成独占锁和不同步的问题
-
yield()方法
放弃当前cpu资源,但是不知道什么时候又会获取cpu
-
线程优先级
1-10,越高优先级越高,优先级高的线程,有可能先执行完毕,但是也不一定,在线程的委托关系中,优先级是共享的
setPriority()设置优先级
getPriority()得到优先级
-
守护线程
使用setDeamon(true)来变成守护线程
守护线程只有在非守护线程全结束时,自己才会自动结束
二、类和变量的并发访问
- 实例变量会产生非线程安全问题,因为实例变量是线程间共享的
- 局部变量不会产生非线程安全问题,因为在虚拟机栈中,局部变量是线程私有的
。。。。。。等待更新