36-案例实现
案例实现
根据如下步骤来实现本例。
1.创建一个 Flag 类,并创建一个布尔型的 flag 公有字段且默认值为 true :
public class Flag {
public boolean flag=true;
}
2.创建一个 VolatileFlag 类,并创建一个布尔型的 flag 公有字段且默认值为 true 。添加 volatile 修饰符到该字段的声明上:
public class VolatileFlag {
public volatile boolean flag=true;
}
3.创建一个 Task 类并实现 Runnable 接口。它使用一个 Flag 的私有字段和一个构造方法来初始化它:
public class Task implements Runnable {
private Flag flag;
public Task(Flag flag) {
this.flag = flag;
}
4.实现该任务的 run() 方法。当 flag 值为 true 时,它将自增一个整型变量。然后,写回变量的最终值:
@Override
public void run() {
int i = 0;
while (flag.flag) {
i++;
}
System.out.printf("VolatileTask: Stopped %d - %s\n", i,
new Date());
}
5.创建一个 VolatileTask 类并实现 Runnable 接口。它使用一个 VolatileFlag 私有字段和一个构造方法来初始化它:
public class VolatileTask implements Runnable {
private VolatileFlag flag;
public VolatileTask(VolatileFlag flag) {
this.flag = flag;
}
6.实现该任务的 run() 方法。因为这与前一个 Task 类相等,所以代码细节将不会在这里展示。
7.实现 Main 类及其 main() 方法。首先,创建4个类型对象,它们分别为 Volatile-Flag 、 Flag 、 VolatileTask 和 Task :
public class Main {
public static void main(String[] args) {
VolatileFlag volatileFlag=new VolatileFlag();
Flag flag=new Flag();
VolatileTask vt=new VolatileTask(volatileFlag);
Task t=new Task(flag);
8.然后,创建两个线程来执行该任务,并启动它们,然后阻塞主线程1s:
Thread thread=new Thread(vt);
thread.start();
thread=new Thread(t);
thread.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
9.然后,改变 volatileFlag 变量值来停止 VolatileTask 的执行,并且阻塞主线程1s:
System.out.printf("Main: Going to stop volatile task: %s\n",
new Date());
volatileFlag.flag=false;
System.out.printf("Main: Volatile task stopped: %s\n", new Date());
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
10.最后,改变任务对象的值来停止任务执行,并且阻塞主线程1s:
System.out.printf("Main: Going to stop task: %s\n", new Date());
flag.flag=false;
System.out.printf("Main: Volatile stop flag changed: %s\n",
new Date());
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}