- 继承Thread类的方式进行实现
- 实现Runnable接口的方式进行实现
- 利用Callable和Future接口方式
进程和线程
进程就是在多任务操作系统中,每个独立执行的程序,所以进程也就是“正在进行的程序”
线程是程序运行的基本执行单元 ,当操作系统执行一个程序时,会在系统中建立一个过程,该进程必须至少建立一个程序作为这个程序的入口点。
一 什么是多线程
是指从软件或者硬件上实现多个线程并发执行的技术
具有多线程能力的计算机因有硬件支持能够在同一时间执行多个线程,提升性能
1.继承Thread,重写run方法! -->(不推荐,java是单继承)
public class Demo1Thread extends Thread {
@Override
public void run() {
//打印1-10
for (int i = 1; i <= 10; i++) {
/*
Thread.currentThread(): 获取当前线程
在继承的关系下:this或者super调用getName
*/
System.out.println(this.getName() + "------" + i);
}
}
}
调用:
public class Demo {
public static void main(String[] args) {
System.out.println("main 主线程启动");
//三个线程任务
Demo1Thread demo1Thread = new Demo1Thread();
demo1Thread.start(); //启动线程
Demo1Thread demo1Thread1 = new Demo1Thread();
demo1Thread1.start();
Demo1Thread demo1Thread2 = new Demo1Thread();
demo1Thread2.start();
System.out.println("main 主线程结束");
}
}
2.实现接口Runnable,重写run方法
public class DemoRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "--------" + i);
try {
Thread.sleep(5000); //睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
调用:
public class Demo {
public static void main(String[] args) {
//新建一个线程任务
DemoRunnable demoRunnable = new DemoRunnable();
//将任务交给线程
new Thread(demoRunnable).start();
new Thread(demoRunnable).start();
new Thread(demoRunnable).start();
}
}
3.实现接口Callable,重写call方法。有返回值
public class Demo1 implements Callable<String> {
@Override
public String call() throws Exception {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "----" + 1);
if (i == 5){
Scanner scanner = new Scanner(System.in);
//线程阻塞状态!
System.out.println("是否继续?(y/n)");
String isContinue = scanner.next();
if (isContinue.equals("n")){
break;
}
}
}
return "ok";
}
}
public class DemoCallable {
public static void main(String[] args) {
Demo1 demoCallable = new Demo1();
FutureTask futureTask = new FutureTask(demoCallable);
new Thread(futureTask).start();
try {
//返回值
System.out.println(futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
常用方法:
String getName() 返回次线程的名称
public static Thread currentThread() 返回当前正在执行的线程对象的引用
public static void sleep() : 让线程休眠指定的时间,单位为毫秒