理论基础
TLS
- thread local storage —— 线程局部存储
- 对于同一全局变量或者静态变量,每个线程访问的是同一个变量,这样多个线程同时访问同一个全局变量或者静态变量时会导致冲突,尤其是多个线程同时需要修改这一变量时
- 通过TLS机制,为每一个使用该全局变量的线程都提供一个变量值的副本,每一个线程均可以独立地改变自己的副本,而不会和其他线程的副本冲突
线程调用的两种方式
代码实践
方法一:继承 Thread
public class Actor extends Thread { //继承自线程类
public void run() {
System.out.println(getName() + " 是一个演员\n"); //使用了线程类的getName方法获得当前线程的方法
int count = 0; //记录线程运行多少次
boolean keepRunning = true;
while (keepRunning) {
System.out.println(getName() + " 登台演出 " + (++count));
if (count == 8){ //停止演出
keepRunning = false;
}
if (count%2 == 0) { //中间加停顿
try {
Thread.sleep(3000);
System.out.println("");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(getName() + " 演出结束了");
}
}
main函数中调用查看执行效果
public static void main(String[] args){
Thread actor = new Actor();
actor.setName("Mr.Thread"); //线程里面有setName方法
actor.start(); //线程开始工作
}
/*
Mr.Thread 是一个演员
Mr.Thread 登台演出 1
Mr.Thread 登台演出 2
Mr.Thread 登台演出 3
Mr.Thread 登台演出 4
Mr.Thread 登台演出 5
Mr.Thread 登台演出 6
Mr.Thread 登台演出 7
Mr.Thread 登台演出 8
Mr.Thread 演出结束了
*/
方法二:实现Runnable接口
class Actress implements Runnable { //实现接口 而且是在同一个类中再写一个类
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 是一个演员\n");
//runnable中没有getName方法,获取当前线程的name
int count = 0;
boolean keepRunning = true;
while (keepRunning) {
System.out.println(Thread.currentThread().getName() + " 登台演出 " + (++count));
if (count == 8){
keepRunning = false;
}
if (count%2 == 0) {
try {
Thread.sleep(3000);
System.out.print("\n");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName() + " 演出结束了");
}
}
main函数中调用查看执行效果
public static void main(String[] args){
Thread actress = new Thread(new Actress(), "Ms.Runnable"); //setName方法合并了
actress.start();
}
/*
Ms.Runnable 是一个演员
Ms.Runnable 登台演出1
Ms.Runnable 登台演出2
Ms.Runnable 登台演出3
Ms.Runnable 登台演出4
Ms.Runnable 登台演出5
Ms.Runnable 登台演出6
Ms.Runnable 登台演出7
Ms.Runnable 登台演出8
Ms.Runnable 演出结束了
*/
网友评论