多线程( Thread)
线程:是一个程序内部的一条执行流程。
多线程:是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)。
创建线程:
多线程的创建方式之一:继承Thread类
1.定义一个子类MyThread继承线程类java.lang.Threaf,重写run()方法
2.创建MyTread类的对象
3.调用线程对象的start()方法启动线程(启动后还是执行run()方法的)
优点:编码简单
缺点:线程类已经继承了Thread,无法继承其他类,不利于功能的扩展。
如下就是一个多线程。
创建线程的注意事项:
1.启动线程必须是调用start方法,不是调用run方法。
直接调run方法会当成普通方法执行,此时相当于还是单线程执行
只有调用start方法才是启动一个新的线程执行。
2.不要把主线程任务放在启动子线程之前。
public class Test {//main方法本身 是线程,main方法就是一个线程,main方法启动了线程,main方法就是主线程public static void main(String[] args) {//创建线程的创建方式一:继承Thread类,重写run方法,调用start方法启动线程// 创建线程对象MyThread myThread = new MyThread();// 启动线程myThread.start();for (int i = 0; i < 10; i++) {System.out.println("主线程:" + i);}}
}
// 定义一个类继承Thread类,成为线程类class MyThread extends Thread{// 重写Thread类的run方法@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("线程1:" + i);}}
}
多线程的创建方法二:实现Runnable接口
public class ThreadDemo2 {public static void main(String[] args) {//sRunnable runnable=new MyRunnable();Thread t = new Thread(runnable);t.start();for (int i = 0; i < 10; i++) {System.out.println("主线程任务正在执行"+i);}}
}
//定义一个线程任务实现Runnable接口
class MyRunnable implements Runnable{@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("子线程任务正在执行"+i);}}
}
匿名内部类写法
public static void main(String[] args) {//sRunnable runnable=new Runnable(){public void run() {for (int i = 0; i < 10; i++) {System.out.println("子线程任务正在执行"+i);}}};Thread t = new Thread(runnable);t.start();for (int i = 0; i < 10; i++) {System.out.println("主线程任务正在执行"+i);}}
线程的创建方式三:实现Callable接口、FuntureTask类类实现
前两种创建方式存在问题:重写的run方法不能直接返回数据 结果。
JDK5.0提供了Callable接口和FutureTask类来实现(多线程第三种创建方式)
优点:可以返回线程执行完毕后的结果。
public static void main(String[] args) {Callable<Integer> myCallable = new MyCallable(15);FutureTask<Integer> task = new FutureTask<>(myCallable);Thread t = new Thread(task);t.start();Callable<Integer> myCallable1= new MyCallable(20);FutureTask<Integer> task1 = new FutureTask<>(myCallable1);Thread t1 = new Thread(task1);t1.start();try {int sum = task.get();System.out.println("子线程1计算结果为:"+sum);} catch (Exception e) {e.printStackTrace();}try {int sum = task1.get();System.out.println("子线程2计算结果为:"+sum);} catch (Exception e) {e.printStackTrace();}for (int i = 0; i < 10; i++) {System.out.println("主线程任务正在执行"+i);}}
}
class MyCallable implements Callable<Integer> {int j;public MyCallable(int j) {this.j = j;}@Overridepublic Integer call() throws Exception {for (int i = 0; i < 10; i++) {j+=i;}return j;}
三种线程的创建方式不同点
线程的常见方法
Thread的常用方法
public class Threadmain {public static void main(String[] args) {//创建两个线程Thread t1=new MyThread1();Thread t2=new MyThread1();t1.start();t2.start();System.out.println(t1.getName());System.out.println(t2.getName());t1.setName("线程1");t2.setName("线程2");System.out.println(t1.getName());System.out.println(t2.getName());try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}try{t1.join();}catch(InterruptedException e){e.printStackTrace();}}
}
class MyThread1 extends Thread{public void run(){for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"正在运行"+i);}}
}