public class ThreadCloseGraceful {
private static class Worker extends Thread {
private volatile boolean start = true;
@Override
public void run() {
while (start) {
//
}
System.out.println("停止");
}
public void shutdown() {
this.start = false;
}
}
public static void main(String[] args) {
Worker worker = new Worker();
worker.start();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
worker.shutdown();
}
}
代码:charapter6
1.开关的方式
2.打断的方式
public class ThreadCloseGraceful2 {
private static class Worker extends Thread {
@Override
public void run() {
while (true) {
if (Thread.interrupted()){
System.out.println("打断");
break;
}
}
//-------------
//-------------
//-------------
}
}
public static void main(String[] args) {
Worker worker = new Worker();
worker.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
worker.interrupt();
}
}
有一个问题,假设我们没有判断interrupted的机会呢?也不能判断flag,此时以上的两个方法都不可以了。
状态:cnblogs.com/soulmatesjc/p/11213884.html
package chapter6;
/***************************************
* @author:Alex Wang
* @Date:2017/2/19 QQ:532500648
* QQ交流群:286081824
***************************************/
public class ThreadService {
private Thread executeThread;
private boolean finished = false;
public void execute(Runnable task) {
executeThread = new Thread() {
@Override
public void run() {
Thread runner = new Thread(task);
runner.setDaemon(true);
runner.start();
try {
runner.join();
//这里是为了什么?executeThread起来了执行到start()就结束了,可能守护线程还没来得及执行呢。join下,知直到runner执行死掉为止。
finished = true;
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("all over");
}
}
};
executeThread.start();
}
public void shutdown(long mills) {
long currentTime = System.currentTimeMillis();
while (!finished) {
if ((System.currentTimeMillis() - currentTime) >= mills) {
System.out.println("任务超时,需要结束他!");
executeThread.interrupt();
break;
}
try {//没有执行结束也没有超时
executeThread.sleep(1);
} catch (InterruptedException e) {
System.out.println("执行线程被打断!");
break;
}
}
finished = false;
}
}
package chapter6;
/***************************************
* @author:Alex Wang
* @Date:2017/2/19 QQ:532500648
* QQ交流群:286081824
***************************************/
public class ThreadCloseForce {
public static void main(String[] args) {
ThreadService service = new ThreadService();
long start = System.currentTimeMillis();
service.execute(() -> {
//load a very heavy resource.
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(123);
}
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }//假设5秒搞定了
});
service.shutdown(10000);
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
线程中断:https://blog.csdn.net/u014543872/article/details/90549240
https://blog.csdn.net/u014543872/article/details/90549240
---------------------16-----17----------优雅的停止线程------------------
代码:chapter7
index是499
三个线程都是进入这个位置:
进入了箭头位置。
解决:
synchronized (MONITOR) {
if (index > MAX)
break;
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + " 的号码是:" + (index++));
}
---------------------------------------18------------------------线程安全----------------
synchronized到底是什么东西呢?
public class SynchronizedTest {
private final static Object LOCK = new Object();
public static void main(String[] args) {
Runnable runnable = () -> {
synchronized (LOCK) {
try {
Thread.sleep(200_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
Thread t3 = new Thread(runnable);
t1.start();
t2.start();
t3.start();
}
}
共享数据去串行化去运行。
------------------------------------------------19----------------synchronized----------------------------------------------
代码:chapter/demo3 小把戏而已。
读:共享数据你读的时候可能被修改了
改:同样
-----------------------------------------------20------------同步代码块和同步方法区别----------------------------------
来源:CSDN
作者:菜鸟级别选手
链接:https://blog.csdn.net/qq_28764557/article/details/103457242