1·线程概述
1·1进程
进程:正在运行的程序
10.2线程
一个进程中存在一个或者多个线程。
2·线程创建
三种方式:
1.继承Thread类(不好用)
2.实现Runnable接口。
3实现Callable接口。
2·1Thread类
步骤:
定义一个子类继承Thread类,重写run方法,创建子类的实例对象,调用start方法启动线程。
代码如下:
package com.xiao;
class MyThread1 extends Thread{
public MyThread1(String name){
super(name);
}
public void run(){
int i=0;
while (i++<5){
//currentThread().getName()是为了当前对象的线程名称
System.out.println(Thread.currentThread().getName()+"run的方法在运行");
}
}
}
public class Example01 {
public static void main(String[] args) {
MyThread1 thread1 = new MyThread1("thread1");
thread1.start();
MyThread1 thread2 =new MyThread1("thread2");
thread2.start();
}
}
输出结果:
thread2run的方法在运行
thread1run的方法在运行
thread2run的方法在运行
thread1run的方法在运行
thread2run的方法在运行
thread1run的方法在运行
thread2run的方法在运行
thread1run的方法在运行
thread2run的方法在运行
thread1run的方法在运行
2·2Runnable接口实现多线程
步骤
创建一个Runnable接口的实现类,重写run方法,创建实现类对象,使用Thread有参构造方法创建线程实例,并将Runnable接口的实现类的实例对象作为参数传入,调用start方法启动。
代码如下
package com.xiao;
class MyThread2 implements Runnable{
@Override
public void run() {
int i=0;
while(i++<5){
System.out.println(Thread.currentThread().getName()+"的run方法在运行");
}
}
}
public class Example02 {
public static void main(String[] args) {
MyThread2 myThread2 = new MyThread2();
Thread thread1 = new Thread(myThread2,"thread1");
thread1.start();
Thread thread2 = new Thread(myThread2,"thread2");
thread2.start();
}
}
输出:
thread2的run方法在运行
thread1的run方法在运行
thread2的run方法在运行
thread1的run方法在运行
thread1的run方法在运行
thread1的run方法在运行
thread1的run方法在运行
thread2的run方法在运行
thread2的run方法在运行
thread2的run方法在运行
2·3Callable接口实现多线程
步骤和Runnable接口的差不多,区别就是Runnable不带返回值,它可以带返回值。
创建一个Callable接口的实现类,同时重写Callable接口的call方法。
创建Callable接口的实现类对象。
通过FutureTask线程处理结果处理类的有参构造方法来封装Callable接口实现类对象。
使用参数为FutureTask类对象的Thread有参构造方法创建Thread线程实例。
调用start方法启动线程。
代码如下:
package com.xiao;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
class MyThread3 implements Callable<Object>{
@Override
public Object call() throws Exception {
int i=0;
while(i++<5){
System.out.println(Thread.currentThread().getName()+"call()方法正在运行");
}
return i ;
}
}
public class Example03 {
public static void main(String[] args) throws Exception{
MyThread3 myThread3 = new MyThread3();
FutureTask<Object>ft1 = new FutureTask<>(myThread3);
Thread thread1 = new Thread(ft1,"thread1");
thread1.start();
FutureTask<Object>ft2 = new FutureTask<>(myThread3);
Thread thread2 = new Thread(ft2,"thread2");
thread2.start();
System.out.println("thread1返回结果"+ft1.get());
System.out.println("thread2返回结果"+ft2.get());
}
}
输出:
thread1call()方法正在运行
thread2call()方法正在运行
thread1call()方法正在运行
thread2call()方法正在运行
thread1call()方法正在运行
thread2call()方法正在运行
thread1call()方法正在运行
thread2call()方法正在运行
thread1call()方法正在运行
thread2call()方法正在运行
thread1返回结果6
thread2返回结果6
实战区别
一个售票厅,有四个售票窗口,来卖100张票。
代码如下:
使用继承Thread类:
package com.xiao;
class TicketWindow extends Thread{
private int tickets = 100;
public void run(){
while (true){
if(tickets>0){
System.out.println(Thread.currentThread