博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程(1)-java多线程入门
阅读量:6230 次
发布时间:2019-06-21

本文共 1873 字,大约阅读时间需要 6 分钟。

hot3.png

一、线程实现方式

 

线程实现有两种方式:继承Thread类,实现Runnable接口

1、继承Thread类

public class MyThread extends Thread{    @Override    public void run() {        System.out.println("Mythread执行");    }}
public class TestMain {    public static void main(String[] args) {        MyThread mythread = new MyThread();        mythread.start();    }}

要点:继承Thread类,重写run方法,在run方法内编写代码实现业务。通过Thread实例的start方法启动多线程。

 

2、实现Runnable接口

public class MyRunnable implements Runnable{    @Override    public void run() {        System.out.println("MyRunnable执行");    }}
public class TestMain {    public static void main(String[] args) {        Thread thread = new Thread(new MyRunnable());        thread.start();    }}

要点:实现Runnable接口,实现run方法,在run方法内编写代码实现业务。通过Thread(new Runnable实现类)构造函数,构造Thread,通过Thread实例的start方法启动多线程。

 

 二、Thread 和 Runnable 的不同点

Runnable是接口;

Thread 是类,Thread本身是实现了Runnable接口的类;

我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。

此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。

通常,建议通过“Runnable”实现多线程!

 

 

三、为什么线程通过start启动,而不是run方法启动

 

查看Thread源码中的start方法

 

public synchronized void start() {	//如果线程不是"就绪状态",则抛出异常!	if (threadStatus != 0)		throw new IllegalThreadStateException();	//将线程添加到ThreadGroup中	group.add(this);	boolean started = false;	try {		// 通过start0()启动线程		start0();		 // 设置started标记		started = true;	} finally {		try {			if (!started) {				group.threadStartFailed(this);			}		} catch (Throwable ignore) {			}	}}

 Thread调用start方法时,会启动start0()方法,而start0()是一个native方法,此时然后java虚拟机则会调用run方法,启动另外一个线程,

 

而当前start方法继续执行,这时有两个线程同时运行,当start()方法执行完成之后,线程start方法执行结束,该线程不可以重新启动。

public void run() {	if (target != null) {		target.run();	}}

 

继续看run方法,如果是线程本身是通过实现Runnable接口构建的,那么调用Runnable的run方法,否则调用重写了run方法的Thread类的方法。

所以,只可以通过start方法启动线程,而调用run方法时,只是调用run方法而已,不会启动另外一个线程。

 

 

四、小结

一旦涉及到多线程需要解决的问题,一般会有共享资源,那么尽量采用实现Runnable接口的实现方式,可以在多线程之间共享资源。

 

 

转载于:https://my.oschina.net/haoran100/blog/712522

你可能感兴趣的文章
Google地图,Baidu地图数据供应商
查看>>
抽象类
查看>>
node溢出
查看>>
【转】充满浮躁的程序员
查看>>
jquery tips 提示层
查看>>
Python 之IO模型
查看>>
SSH项目tomcat发布时,Initializing Spring root WebApplicationContext卡死不动
查看>>
Lombok
查看>>
Single Number II
查看>>
由于一个老熟人对架构的一句话而拉黑了他。
查看>>
Mysql第八天 分区与分表
查看>>
CF 558A(Lala Land and Apple Trees-暴力)
查看>>
关于继承Fragment后重写构造方法而产生的错误
查看>>
2017-5-7 账号激活 权限设置 销售 仓库 财务三大模块
查看>>
datepicker插件的使用
查看>>
用户定义的变量+HTTP Cookie 管理器组合实现接口关联+问题处理
查看>>
linux中查找文件中的内容
查看>>
【C#学习笔记】调用C++生成的DLL
查看>>
Java:类与继承
查看>>
jQuery带tab切换搜索框样式代码
查看>>