Java并发编程
1、创建线程的方法
1.1、继承Thread类
public class Demo1 extends Thread {//1、继承Thread类
public Demo1(String name) { super(name);}
@Override
public void run() { }//2、重写Thread类型run方法
public static void main(String[] args) {
Demo1 d1 = new Demo1("first-thread");//3、创建线程
d1.start();//4、调用start方法,启动线程
} }
1.2、实现Runnable接口
public class Demo2 implements Runnable {//1、实现runnable接口
@Override
public void run() {}//2、实现run方法
public static void main(String[] args) {
Thread thread = new Thread(new Demo2());//3、创建人物Demo2,并把任务赋给创建的线程
thread.start();//4、调用start方法启动线程
} }
1.3、匿名内部类的方式
1.4、 带返回值并可抛出异常的线程
public class Demo4 implements Callable<Integer> {//1、实现Callable接口,并指定返回值类型
public static void main(String[] args) throws Exception {
Demo4 d = new Demo4();//3、创建线程执行的任务
FutureTask<Integer> task = new FutureTask<>(d);//4、创建线程执行返回值的接收器
Thread t = new Thread(task);//5、创建线程
t.start();//6、启动线程
Integer result = task.get();//7、获取线程的返回值
System.out.println("线程执行的结果为:" + result); }
@Override
public Integer call() throws Exception {//2、重写call方法,该方法可抛出异常,并有返回值
Thread.sleep(3000);
return 1;
}}
1.5、定时器(quartz)
定时器的创建主要使用的是java.util.Timer;java.util.TimerTask;
public class Demo5 {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override public void run() {
// 实现定时任务 System.out.println("timertask is run");
} }, 0, 1000);
} }
1.6、线程池方法
public class Demo6 {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newCachedThreadPool();//1、创建一个可以动态调整大小的线程池
for (int i = 0; i < 1000; i++) {
threadPool.execute(new Runnable() {//2、为线程赋执行任务
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
}
threadPool.shutdown();//3、关闭线程池
} }
2、线程的详细状态
线程终止
jdk1.6以前使用线程的stop方法强制终止线程,该方式不推荐使用。jdk1.6以后使用interrupt()方式。实现方式如下
@Override public void run() {
while(!interrupted()) {//2、判断线程为终止状态后,结束线程的循环,达到优雅终止线程。
System.out.println(getName() + "线程执行了 .. ");
}
public static void main(String[] args) {
Demo1 d1 = new Demo1("first-thread");
d1.start();
// d1.stop();
d1.interrupt();//1、线程运行中修改线程状态为终止
}
3、线程类型
3.1、守护线程
线程可以通过setDaemon(true)方法的方式将线程,设为守护线程,守护线程在主线程执行结束后,自动结束。