停止线程
stop方法,但是不优雅
可以使用以下方法,给定一个flag标志,在外面控制flag的值
public class StopThread {
public static void main(String[] args) throws InterruptedException {
ChildThread childThread = new ChildThread();
Thread thread = new Thread(childThread);
childThread.setFlag(true);
thread.start();
thread.setName("子线程for i 100");
//主线程沉睡2s
Thread.sleep(2000);
//关闭子线程
childThread.setFlag(false);
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + " " + i + "");
}
}
}
class ChildThread implements Runnable {
private boolean flag;
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (flag) {
try {
Thread.sleep(30);
System.out.println(Thread.currentThread().getName() + ": " + i + " ");
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
return;
}
}
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
Synchronized
锁类、锁方法、锁代码块
-
synchronized(){}同步代码块,把想要加锁的代码,放在里面
-
synchronized(this){}写在成员方法中,括号里写this
-
synchronized(类名.class){}写在静态方法中,括号里写类名.class
class Dead1 extends Thread{
Object o1;
Object o2;
public Dead1(Object o1, Object o2) {
this.o1 = o1;
this.o2 = o2;
}
@Override
public void run() {
synchronized (o1){
System.out.println("锁住o1" + Thread.currentThread().getName());
synchronized (o2){
System.out.println("执行o2");
}
}
}
}
class NumBer {
int a = 10;
Lock lock = new ReentrantLock();
//synchronized
public void addSome() {
lock.lock();
a++;
System.out.println(a);
lock.unlock();
System.out.println("--------------------------------");
}
}
定时器
继承TimerTask类
class FreeArr extends TimerTask {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
Random random = new Random();
@Override
public void run() {
int i = random.nextInt(9) + 1;
arrayList.add(i);
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " "+Thread.currentThread().getName() + "");
arrayList.forEach(System.out::println);
}
}
调用(包含关闭方法)
class TOne extends Thread {
FreeArr freeArr;
Timer timer = new Timer();
public TOne(FreeArr freeArr) {
this.freeArr = freeArr;
}
@Override
public void run() {
timer.schedule(freeArr, new Date(System.currentTimeMillis() + 1000), 1000);
try {
Thread.sleep(4000);
timer.cancel();
timer.purge();
timer = null;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}