1线程停止
建议自己写一个线程停止的方法
package hello;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Main implements Runnable{
private boolean flag=true;
public static void main(String[] args){
Main t=new Main();
new Thread(t).start();
for(int i=0;i<1000;i++) {
System.out.println(i);
if(i==900) {
t.stop();
System.out.println("线程停止了");
}
}
}
@Override
public void run() {
// TODO Auto-generated method stub
int i=0;
while(flag) {
System.out.println("线程正在运行"+i++);
}
}
public void stop() {
this.flag=false;
}
}
2线程休眠
使用线程休眠会将线程的问题放大
package hello;
import java.util.*;
public class Main implements Runnable{
private int ticket=10;
public static void main(String[] args) {
Main m=new Main();
new Thread(m,"江小鱼").start();
new Thread(m,"路演").start();
new Thread(m,"张冲").start();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
if(ticket<=0) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"拿到第"+ticket--+"张票");
}
}
}
这是使用线程休眠得到的结果
张冲拿到第10张票
江小鱼拿到第8张票
路演拿到第9张票
江小鱼拿到第7张票
张冲拿到第6张票
路演拿到第5张票
江小鱼拿到第4张票
路演拿到第3张票
张冲拿到第2张票
江小鱼拿到第1张票
路演拿到第0张票
张冲拿到第-1张票
这是不使用线程休眠得到的结果
江小鱼拿到第10张票
张冲拿到第8张票
路演拿到第9张票
张冲拿到第6张票
江小鱼拿到第7张票
张冲拿到第4张票
路演拿到第5张票
张冲拿到第2张票
江小鱼拿到第3张票
路演拿到第1张票
使用线程休眠模拟倒计时
package hello;
import java.util.*;
public class Main{
public static void main(String[] args) throws InterruptedException {
int n=5;
while(n>0) {
System.out.println(n--);
Thread.sleep(1000);
}
}
}
使用线程休眠隔一秒打印当前时间
package hello;
import java.text.SimpleDateFormat;
import java.util.*;
public class Main{
public static void main(String[] args) throws InterruptedException {
Date time=new Date(System.currentTimeMillis());
SimpleDateFormat t=new SimpleDateFormat("HH:mm:ss");
for(int i=0;i<5;i++) {
System.out.println(t.format(time));
Thread.sleep(1000);
time=new Date(System.currentTimeMillis());
}
}
}
10:30:44
10:30:45
10:30:46
10:30:47
10:30:48
3线程礼让
线程由运行状态变为就绪状态
package hello;
import java.text.SimpleDateFormat;
import java.util.*;
public class Main implements Runnable{
public static void main(String[] args){
Main t1=new Main();
Main t2=new Main();
new Thread(t1,"a").start();
new Thread(t1,"b").start();
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"线程开始");
Thread.yield();
System.out.println(Thread.currentThread().getName()+"线程结束");
}
}
a线程开始
b线程开始
b线程结束
a线程结束
4线程强制执行
先将使用join的线程执行完再执行其他的线程
package hello;
import java.text.SimpleDateFormat;
import java.util.*;
public class Main implements Runnable{
public static void main(String[] args) throws InterruptedException{
Main m1=new Main();
Thread t=new Thread(m1);
t.start();
for(int i=0;i<200;i++) {
if(i==100)
t.join();
System.out.println("main线程"+i);
}
}
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// TODO Auto-generated method stub
for(int i=0;i<100;i++) {
System.out.println("线程vip来了"+i);
}
}
}
5守护线程
线程分为用户线程和守护线程
虚拟机必须确保用户线程执行完毕
虚拟机不用等待守护线程执行完毕
package hello;
import java.text.SimpleDateFormat;
import java.util.*;
public class Main{
public static void main(String[] args){
People p=new People();
God g=new God();
Thread t1=new Thread(p);
Thread t2=new Thread(g);
t2.setDaemon(true);
t1.start();
t2.start();
}
}
class People implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++) {
System.out.println("第"+i+"天");
}
}
}
class God implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
System.out.println("上帝守护着你");
}
}
}