https://www.cnblogs.com/kexianting/p/8566318.html
java 多线程
java 多线程
线程的生命周期
线程的生命周期包括:
新建:
线程刚刚被创建出来,new Thread()阶段
就绪:
线程创建完成,调用start() 方法
运行:
执行run() 方法里面的内容
阻塞:
遇到sleep() ,或者是线程处于被挂起的状态
消亡:
正常执行结束,就会消亡
java 线程的创建方式
- 继承Thread类
Thread 继承了 Runnable 里面常用的方法
start() : 线程的启动方法
run():线程具体的执行的业务逻辑
join():线程在执行过程中可以加入
sleep(): 线程休眠的方法,不释放线程锁,其他线程无法获取锁信息
wait():线程处于等待状态同时释放锁
-
实现Runnable 接口
-
实现Callable 接口
Callable 是 线程的实现方法call 是带返回值的,通知可以使用泛型,具体使用实例如下
/**
* @{#} CallTest1.java Create on 2020年8月25日 下午1:44:54
*
* Copyright (c) 2013 by Logan.
*/
package test.thread.call;
import java.util.concurrent.Callable;
/**
* @author jiangcl
* @version 1.0
* @desc
*/
public class CallTest1 implements Callable<String>{
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
System.out.println("callable 接口执行力");
return "success";
}
}
/**
* @{#} MainTest.java Create on 2020年8月25日 下午1:46:44
*
* Copyright (c) 2013 by Logan.
*/
package test.thread.call;
import java.util.concurrent.FutureTask;
/**
* @author jiangcl
* @version 1.0
* @desc
*/
public class MainTest {
public static void main(String[] args) {
CallTest1 test1 = new CallTest1();
FutureTask<String> task = new FutureTask<String>(test1);
new Thread(task).start();
}
}
java 如何保证线程安全
synchronized 关键字的使用:
- synchronized 修饰的方法
修饰方法相当于给方法加锁,必须等方法执行完,其他的线程才能进入
/**
* @{#} SynTest.java Create on 2020年9月9日 下午2:16:34
*
* Copyright (c) 2013 by Logan.
*/
package test.thread.fuc;
/**
*
* @author jiangcl
*
* @version 1.0
* @desc
*
*/
public class SynTest implements Runnable {
public int num = 0;
public synchronized void FunTest() {
num = num + 1;
System.out.println(Thread.currentThread().getName() + ":" + num);
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
FunTest();
}
}
}
/**
* @{#} MainTest.java Create on 2020年9月9日 下午2:19:25
*
* Copyright (c) 2013 by Logan.
*/
package test.thread.main;
import test.thread.fuc.SynTest;
/**
* @author jiangcl
* @version 1.0
* @desc
*/
public class MainTest {
public static void main(String[] args) {
SynTest synTest = new SynTest();
Thread th1 = new Thread(synTest);
Thread th2 = new Thread(synTest);
th1.start();
th2.start();
}
}
如果不加 synchronized
加了 synchronized 就可以获取同一个num。
- synchronized 修饰的代码块
synchronized 修饰的代码块 格式为
synchronized (对象){}
括号中为同一个对象时,相当于给一个对象加锁,
- static,synchronized同时修饰的方法: