实现线程(3种方法)

it2025-01-17  3

实现线程 1.第一种方式: 编写一个类,直接继承java.lang.Thread,重写run方法

package com; import java.io.*; public class Test { public static void main(String[] args) throws IOException { //这里是main方法。这里代码是属于主线程,在主栈中运行。 //新建一个分支线程对象 MyThread myThread = new MyThread(); //启动线程 //myThread.run();//不会启动线程。不会分配新的分支栈(这种方式是单线程) //start方法作用:启动一个分支线程,是在jvm中开辟一个新的栈空间,这端段代码的任务完成后,瞬间就结束了 //这段代码的任务是为了开辟一个新的栈空间,只要新的栈空间开出来了,start()方法就结束了,线程就启动成功了。 //启动成功的线程会自动 的调用run方法,并且run方法在分支栈的栈底部(压栈)。 //run方法在分支栈的栈底部,main方法在主栈的栈底部。run和main是平级。 // myThread.start(); //这里的代码还是运行在主线程里 for (int i = 0; i < 1000; i++) { System.out.println("主线程" + i); } } } class MyThread extends Thread { @Override public void run() { //编写程序,这段程序运行在分支线程中(分支栈) for (int i = 0; i < 1000; i++) { System.out.println("分支线程" + i); } } }

run()和start()区别 调用start方法实现多bai线程,而调用run方法没有实du现多线程 2.实现线程第2种方式 编写一个类实现java.lang.Runnable接口。

package com; import java.io.*; public class Test { public static void main(String[] args) throws IOException { // 创建线程对象,采用匿名类方式 //这是一个通过没名字的类,new出来的对象 Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println("主线程----->" + i); } } }); //启动线程 thread.run(); for (int i = 0; i < 100; i++) { System.out.println("main线程------>" + i); } } }

3.实现线程第2种方式 实现线程第三种方式 实现Callable接口 优点:可以获取线程的执行结果 缺点:当前线程阻塞,效率低

import java.text.ParseException; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * 实现线程第三种方式 * 实现Callable接口 * 优点:可以获取线程的执行结果 * 缺点:当前线程阻塞,效率低。 */ public class test { public static void main(String[] args) throws ParseException, ExecutionException, InterruptedException { //第一步:创建“未来任务”对象 FutureTask task = new FutureTask(new Callable() { @Override public Object call() throws Exception {//call()相当于run().只不过这个有返回值 //线程执行一个任务,执行后有一个返回值 //模拟线程 System.out.println("begin"); Thread.sleep(1000 * 10); System.out.println("over"); int a = 100; int b = 200; return a + b;//自动装箱变300,Integer } }); //创建线程对象 Thread t = new Thread(task); //启动线程 t.start(); //这里是mian方法,在主线程 //在主线程中。怎么获取t线程返回结果 //get()会导致当前线程阻塞 Object o = task.get(); System.out.println("结果是"+o); //main方法必须等get(); System.out.println("helloworld"); } }
最新回复(0)