详解多线程及Runable 和Thread的区别

 更新时间:2019年04月08日 15:50:18   作者:qq_43499096  
这篇文章主要介绍了多线程及Runable 和Thread的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Thread和Runnable区别

执行多线程操作可以选择
继承Thread类
实现Runnable接口

1.继承Thread类

以卖票窗口举例,一共5张票,由3个窗口进行售卖(3个线程)。
代码:

package thread;
public class ThreadTest {
	public static void main(String[] args) {
		MyThreadTest mt1 = new MyThreadTest("窗口1");
		MyThreadTest mt2 = new MyThreadTest("窗口2");
		MyThreadTest mt3 = new MyThreadTest("窗口3");
		mt1.start();
		mt2.start();
		mt3.start();
	}
}
class MyThreadTest extends Thread{
	private int ticket = 5;  
	private String name;
	public MyThreadTest(String name){
		this.name = name;
	}
  public void run(){  
     while(true){ 
       if(ticket < 1){  
        break; 
       }  
       System.out.println(name + " = " + ticket--);  
     }  
  } 
}

执行结果:
窗口1 = 5
窗口1 = 4
窗口1 = 3
窗口1 = 2
窗口1 = 1
窗口2 = 5
窗口3 = 5
窗口2 = 4
窗口3 = 4
窗口3 = 3
窗口3 = 2
窗口3 = 1
窗口2 = 3
窗口2 = 2
窗口2 = 1
结果一共卖出了5*3=15张票,这违背了"5张票"的初衷。
造成此现象的原因就是:

MyThreadTest mt1 = new MyThreadTest("窗口1");
	MyThreadTest mt2 = new MyThreadTest("窗口2");
	MyThreadTest mt3 = new MyThreadTest("窗口3");
	mt1.start();
	mt2.start();
	mt3.start();

一共创建了3个MyThreadTest对象,而这3个对象的资源不是共享的,即各自定义的ticket=5是不会共享的,因此3个线程都执行了5次循环操作。

2.实现Runnable接口

同样的例子,代码:

package thread;
public class RunnableTest {
	public static void main(String[] args) {
		MyRunnableTest mt = new MyRunnableTest();
		Thread mt1 = new Thread(mt,"窗口1");
		Thread mt2 = new Thread(mt,"窗口2");
		Thread mt3 = new Thread(mt,"窗口3");
		mt1.start();
		mt2.start();
		mt3.start();
	}
}
class MyRunnableTest implements Runnable{
	private int ticket = 5;  
	public void run(){  
     while(true){ 
  		 if(ticket < 1){  
  			 break; 
  		 }  
  		 System.out.println(Thread.currentThread().getName() + " = " + ticket--);  
     }  
  } 
}

结果:

窗口1 = 5
窗口1 = 2
窗口3 = 4
窗口2 = 3
窗口1 = 1

结果卖出了预期的5张票。
原因在于:

MyRunnableTest mt = new MyRunnableTest();
Thread mt1 = new Thread(mt,"窗口1");
Thread mt2 = new Thread(mt,"窗口2");
Thread mt3 = new Thread(mt,"窗口3");
mt1.start();
mt2.start();
mt3.start();

只创建了一个MyRunnableTest对象,而3个Thread线程都以同一个MyRunnableTest来启动,所以他们的资源是共享的。

以上所述是小编给大家介绍的多线程及Runable 和Thread的区别详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java人机猜拳实现的思路及方法实例

    Java人机猜拳实现的思路及方法实例

    这篇文章主要给大家介绍了关于Java人机猜拳实现的思路及方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java中6种单例模式写法代码实例

    Java中6种单例模式写法代码实例

    这篇文章主要介绍了Java中6种单例模式写法代码实例,某个类任何情况下只有一个实例,并提供一个全局访问点来获取该实例,Java6种单例模式有2种懒汉式,2种饿汉式,静态内部类 ,枚举类,需要的朋友可以参考下
    2024-01-01
  • SpringBoot前后端分离项目之打包、部署到服务器详细图文流程

    SpringBoot前后端分离项目之打包、部署到服务器详细图文流程

    作为后台开发,项目打包部署是经常性的操作,下面这篇文章主要给大家介绍了关于SpringBoot前后端分离项目之打包、部署到服务器的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • spring解决循环依赖

    spring解决循环依赖

    这篇文章主要介绍了spring如何解决循环依赖,帮助大家更好的理解和使用spring框架,感兴趣的朋友可以了解下
    2020-09-09
  • IDEA使用学生邮箱无法注册问题:JetBrains Account connection error: 拒绝连接

    IDEA使用学生邮箱无法注册问题:JetBrains Account connection error: 拒绝连接

    这篇文章主要介绍了IDEA使用学生邮箱无法注册问题:JetBrains Account connection error: 拒绝连接,文中通过图文及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • java 两个数组合并的几种方法

    java 两个数组合并的几种方法

    本篇文章主要介绍了java 两个数组合并的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • @SpringBootTest 注解报红问题及解决

    @SpringBootTest 注解报红问题及解决

    这篇文章主要介绍了@SpringBootTest 注解报红问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 详解Java两种方式简单实现:爬取网页并且保存

    详解Java两种方式简单实现:爬取网页并且保存

    本篇文章主要介绍了Java两种方式简单实现:爬取网页并且保存 ,主要用UrlConnection、HttpClient爬取实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • 使用spring-data-redis中的Redis事务

    使用spring-data-redis中的Redis事务

    这篇文章主要介绍了使用spring-data-redis中的Redis事务,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • java实现2048小游戏(含注释)

    java实现2048小游戏(含注释)

    这篇文章主要为大家介绍了java实现2048小游戏,含详细注释,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04

最新评论