JAVA多线程
一、线程基础
1.一个java程序叫做一个进程,一个进程由1个或多个线程组成
2. 一个进程的所有线程共享一个内存空间
3. 一个线程是一个独立的执行路径,他是否应该结束,应由其自身决定
4. 在JAVA中,线程分为守护线程和用户线程,
用户线程:当一个进程中所有用户线程都死亡时,进程结束
守护线程:守护用户线程的,当最后一个用户线程死亡时,所有守护线程自杀。 设置守护线程:Thread.setDeamon
5.同步异步
同步:排队进行
异步:同时进行
6.并发并行
并发:多个事务在同一时间段发生
并行;多个事务在同一时刻一起发生
7.线程阻塞:所有耗时操作都可称线程阻塞。
二、Java实现多线程的三种方法
常用两种:
1.继承Thread类,重写run()方法,对象调用start()开启线程。
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
static class MyThread extends Thread{
@Override
public synchronized void start() {
super.start();
}
@Override
public void run() {
for(int i =0;i<10;i++){
System.out.println("不爱"+i);
}
}
}
2.实现Runnable接口,重写run()方法,创建任务对象,创建Thread线程,分配任务任务给线程
public class Main {
public static void main(String[] args) {
//1. 创建事务对象
MyRunnable t = new MyRunnable();
//2. 创建线程,为其分匹配事务t
Thread thread = new Thread(t);
//3.启动线程
thread.start();
}
}
//自定义任务MyRunnable
static class MyRunnable implements Runnable{
@Override
public void run() {
for(int i =0;i<10;i++){
System.out.println("不爱"+i);
}
}
}
3.不常用的第三种:拥有返回值的线程-实现Callable接口并创建对象,使用FutureTask<>创建任务对象,创建新线程执行任务。用get()方法可以得到线程返回值。
public class Main {
public static void main(String[] args) {
MyCallable myCallable = new MyCallable();
//2. 创建任务对象FutureTask,传入对象myCallable
FutureTask<Integer> task = new FutureTask<>(myCallable);
//3. 创建线程,分配任务task,启动线程
new Thread(task).start();
//4. 获取线程返回值,并打印
System.out.println("return:"+task.get());
}
private static class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
for(int i = 0;i<10;i++){
System.out.println(Thread.currentThread().getName()+i);
}
return 0;
}
}
}