java启动线程的两种方式

硅谷探秘者 2333 0 0

java启动线程的三种方式

1.继承 Thread类,重写run方法,调用start方法启动线程

2.实现Runnable接口,重写run方法,调用start方法启动线程

3.实现Callable接口


代码如下

前两种方式:

package club.jiajiajia;

/**
 * 创建线程的两种方式
 */
public class Main {
    public static void main(String[] args) {
        //第一种 继承 Thread类,重写run方法,调用start方法启动线程
        new Thread(){
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(500);
                   System.out.println("Thread name1:"+Thread.currentThread().getName());
                        //得到当前线程的线程名
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();

        //第二种 实现Runnable接口,重写run方法,调用start方法启动线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(500);
                   System.out.println("Thread name2:"+Thread.currentThread().getName());
                        //得到当前线程的线程名
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

第三种方式:

package threadTest.test1;
import java.util.concurrent.Callable;
public class ThreadTest implements Callable<Integer>{

	@Override
	public Integer call() throws Exception {
		// TODO Auto-generated method stub
		//任务
		//返回结果
		return 1;
	}

}
package threadTest.test1;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Test1 {
	public static void main(String[] args) {
		FutureTask<Integer> futureTask = new FutureTask<Integer>(new ThreadTest());
		new Thread(futureTask).start();
		try {
			//接收结果
			Integer sum = futureTask.get();
			System.out.println(sum);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

接着再来看一个面试题

下面的代码执行情况是怎样的??

package club.jiajiajia;

public class Main2 {
    public static void main(String args[]){
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(500);
                   System.out.println("Thread name1:"+Thread.currentThread().getName());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }){
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(500);
                   System.out.println("Thread name2:"+Thread.currentThread().getName());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
}

那么答案当然是 重复打印:Thread name2:Thread-0

原因就是子类重写的方法会覆盖父类的方法,

走进Thread的run方法:

1547644288651064229.png


而targer就是我们传入的Runnable的实现类


QQ截图20190116211053.png


所以Thread的run方法的代码将会被覆盖,不会再调用实现Runnable接口的run方法。


猜你喜欢
java基础 1430 java线中关于中断三个重要法interrupt(),isInterrupted()和interrupted()解释:interrupt():调用某线interrupt()法会改变当前线
official 131 线基本状态:初始化、可运行、运行、阻塞、终止阻塞状态分为:等待阻塞、同步阻塞、其他阻塞三等待阻塞:调用某锁对象wait法可使当前线进入等待阻塞状态,并且该线放弃所有资源(包括
数据库基础 966 1,使用服务名jdbc:oracle:thin:@localhost:1521/orclpdborclpdb是oracle数据库服务名2,使用SIDjdbc:oracle:thin:@localhost:1521:orclorcl是oracle数据库SID
java基础 1119 ”。线对象被创建后,其它线调用了该对象start()法,从而来线。例如,thread.start()。处于就绪状态线,随时可能被CPU调度执行。3.运行状态(Running):线获取C
weblog 216 1.双重检查特点:线安全;延迟加载;效率较高,推荐使用/*** 双重检查线安全;延迟加载;效率较高。*@authorLENOVO**/publicclassSingleton
java基础 4523 (Runnabletarget,Stringname)。法:start:线。yield:注意这是一个静态法。使当前运行线释放处理器资源。sleep:这也是一个静态法,即使当前运行线休眠millis毫秒join:
official 40 案1.打包时候指定配置文件,例如cleaninstall-Ptest2.时候指定配置文件,例如java-jar-Dspring.profiles.active=testdemo-0.0.1-SNAPSHOT.jar
c++ 154 案1.打包时候指定配置文件,例如cleaninstall-Ptest2.时候指定配置文件,例如java-jar-Dspring.profiles.active=testdemo-0.0.1-SNAPSHOT.jar
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议
目录
祝愿神州十三飞行乘组平安归来