java启动线程的两种方式

硅谷探秘者 4392 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基础 2151 java线中关于中断三个重要法interrupt(),isInterrupted()和interrupted()解释:interrupt():调用某线interrupt()法会改变当前线
official 817 线基本状态:初始化、可运行、运行、阻塞、终止阻塞状态分为:等待阻塞、同步阻塞、其他阻塞三等待阻塞:调用某锁对象wait法可使当前线进入等待阻塞状态,并且该线放弃所有资源(包括
数据库基础 2006 1,使用服务名jdbc:oracle:thin:@localhost:1521/orclpdborclpdb是oracle数据库服务名2,使用SIDjdbc:oracle:thin:@localhost:1521:orclorcl是oracle数据库SID
java基础 2655 ”。线对象被创建后,其它线调用了该对象start()法,从而来线。例如,thread.start()。处于就绪状态线,随时可能被CPU调度执行。3.运行状态(Running):线获取C
weblog 852 1.双重检查特点:线安全;延迟加载;效率较高,推荐使用/*** 双重检查线安全;延迟加载;效率较高。*@authorLENOVO**/publicclassSingleton
java基础 5343 (Runnabletarget,Stringname)。法:start:线。yield:注意这是一个静态法。使当前运行线释放处理器资源。sleep:这也是一个静态法,即使当前运行线休眠millis毫秒join:
java基础 1295 java线通讯之生产者消费者模生产者消费者模是并发、多线中经典设计模,生产者和消费者通过分离执行工作解耦,简化了开发模,生产者和消费者可以以不同速度生产和消费数据。一个生产和消
java基础 2969 1.什么是线通信线之间通信个基本问题是互斥和同步。线同步是指线之间所具有制约关系,一个线执行依赖另一个线消息,当它没有得到另一个线消息时应等待,直到消息到达时才被唤醒
归档
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 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。