简单说明线程不安全是什么情况:
package com.zhang.test.thread;
public class Test1 implements Runnable{
private static Test1 test1 = new Test1();
static int i = 0;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(test1);
Thread t2 = new Thread(test1);
t1.start();
t2.start();
/**join的意思是使得放弃当前线程的执行,并返回对应的线程,例如下面代码的意思就是:
程序在main线程中调用t1线程的join方法,则main线程放弃cpu控制权,并返回t1线程继续执行直到线程t1执行完毕
所以结果是t1线程执行完后,才到主线程执行,相当于在main线程中同步t1线程,t1执行完了,main线程才有执行的机会
*/
t1.join(); //插队的意思
t2.join();
System.out.println(i);
}
@Override
public void run() {
for(int j = 0;j< 100000;j++)
{
i++;
}
System.out.println("iiiiiii---------->" + i);
}
}
输出结果肯定是小于20万的,很好证明了不安全的现象
在main方法主线程中创建子线程:
public class Test{
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我是" + Thread.currentThread().getName());
}
});
t.start();
}
}
}
创建线程池:
public class Test{
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("我是" + Thread.currentThread().getName());
}
};
executorService.execute(r);
}
executorService.shutdown();
}
}