Java多线程实现的方式有四种
1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
3.通过Callable和FutureTask创建线程
4.通过线程池创建线程
前面两种可以归结为一类:无返回值,原因很简单,通过重写run方法,run方式的返回值是void,所以没有办法返回结果
后面两种可以归结成一类:有返回值,通过Callable接口,就要实现call方法,这个方法的返回值是Object,所以返回的结果可以放在Object对象中
线程的几个方法:
join
* 让调用的线程先执行指定时间或执行完毕
中断线程的方法:
* 中断线程:
* 1.使用interrupt方法,中断线程,设置一个中断状态(标记),但是很多方法会清除此标记
* 2.使用自定义标记的方式
守护线程:
t.setDaemon(true);
//把线程设置为守护线程/*线程可以分为守护线程和用户线程,当进程中没有用户线程时,jvm会退出*/
线程的同步:
* 1.多线程同享数据时,会发生线程不安全的情况()
* 2.多线程共享数据必须使用同步
* 同步三种方法
* 1.使用同步代码块
class MyThread implements Runnable{
private int ticket=10;
//private Object obj=new Object();//同步锁
public void run(){
for (int i=0;i<50;i++){
// synchronized (this){
// ticket--;
// try {
// Thread.sleep(300);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName());
// System.out.println("你购买的票剩余"+ticket+"张");
// }
method();
}
}
* 2.使用同步方法
//同步的对象是当前对象
class MyThread implements Runnable{
public void run(){
for (int i=0;i<50;i++){
method();
}
}
private synchronized void method(){
if (ticket>0){
ticket--;
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("你购买的票剩余"+ticket+"张");
}
}
* 3.使用lock(更灵活的代码控制)
}
//互斥锁
ReentrantLock lock=new ReentrantLock();
//lock实现同步
private void method2(){
lock.lock();//锁
try {
if (ticket>0){
ticket--;
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("你购买的票剩余"+ticket+"张");
}
} finally {
lock.unlock();//释放锁
}
多线程共享数据,会有安全问题,使用同步可以解决安全问题,但同时会牺牲性能,所以同步的代码块要尽量保持简短,把不随数据变化的
的相关代码块移除代码块,不要阻塞
原文:https://www.cnblogs.com/duguo/p/10570238.html