java中利用继承类和Runnable接口实现多线程的区别

利用继承Thread类实现的多线程无法资源共享

如下程序

class MyThread extends Thread{
public MyThread(String name){
super();
this.name=name;
}
public void run(){
while(tickets==0?false:true)
{
tickets--;
System.out.println(name+" just selt one ticket,only "+tickets+" left");
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private int tickets=10;
private String name;
}
public class SellTickets{
public static void main(String[] args){
MyThread aMyThread1=new MyThread("MyThread 1");
MyThread aMyThread2=new MyThread("MyThread num 2");
aMyThread1.start();
aMyThread2.start();
}
}

打印结果如下:

MyThread 1 just selt one ticket,only 9 left
MyThread num 2 just selt one ticket,only 9 left
MyThread 1 just selt one ticket,only 8 left
MyThread num 2 just selt one ticket,only 8 left
MyThread num 2 just selt one ticket,only 7 left
MyThread 1 just selt one ticket,only 7 left
MyThread num 2 just selt one ticket,only 6 left
MyThread 1 just selt one ticket,only 6 left
MyThread num 2 just selt one ticket,only 5 left
MyThread 1 just selt one ticket,only 5 left
MyThread 1 just selt one ticket,only 4 left
MyThread num 2 just selt one ticket,only 4 left
MyThread 1 just selt one ticket,only 3 left
MyThread num 2 just selt one ticket,only 3 left
MyThread 1 just selt one ticket,only 2 left
MyThread num 2 just selt one ticket,only 2 left
MyThread 1 just selt one ticket,only 1 left
MyThread num 2 just selt one ticket,only 1 left
MyThread 1 just selt one ticket,only 0 left
MyThread num 2 just selt one ticket,only 0 left

可以看出,其实只有10张票,但两个线程分别卖了10张,共卖了20张。

当然也可以通过把tickets定义为static,即private static int tickets=10;也可以达到目的,只卖10张 票

用Runnable接口实现如下:

class MyThread implements Runnable{
public MyThread(String name){
super();
this.name=name;
}
public void run(){
while(tickets==0?false:true){
tickets--;
System.out.println(Thread.currentThread().getName()+" just selt one ticket,only "+tickets+" left");
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private String name;
private int tickets=10;
}
public class SellTicketsRunnable{
public static void main(String[] args){
MyThread aMyThread=new MyThread("My Thread");
new Thread(aMyThread).start();
new Thread(aMyThread).start();
}
}

打印接口如下:

Thread-0 just selt one ticket,only 9 left
Thread-1 just selt one ticket,only 8 left
Thread-0 just selt one ticket,only 7 left
Thread-1 just selt one ticket,only 6 left
Thread-0 just selt one ticket,only 5 left
Thread-1 just selt one ticket,only 4 left
Thread-0 just selt one ticket,only 3 left
Thread-1 just selt one ticket,only 2 left
Thread-0 just selt one ticket,only 1 left
Thread-1 just selt one ticket,only 0 left

可以看出虽然有两个线程,但两个线程的构造参数是同一个对象,访问的是同一个对象的资源。卖了10张票,达到了资源共享

时间: 2024-10-21 19:44:14

java中利用继承类和Runnable接口实现多线程的区别的相关文章

Java通过继承thread类与实现Runnable接口实现多线程的区别

Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 一.通过继承Thread类实现多线程 class MyThread extends Thread{ String name = null; int ticket = 0; public MyThread(String name){ this.name = name; } public synchronized v

java中,一个类实现某个接口,必须重写接口中的所有方法吗

不一定,关键要看子类是否是抽象类.如果子类是非抽象类,则必须实现接口中的所有方法: 如果子类是抽象类,则可以不实现接口中的所有方法,因为抽象类中允许有抽象方法的存在!1.抽象类定义抽象类往往用来表征对问题领域进行分析.设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象.通常在编程语句中用 abstract 修饰的类是抽象类.在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象:在java中,含有抽象方法的类称为抽象类,同样不能生成对象.抽象类是不完整的,它只能用作基类

java中带继承类的加载顺序详解及实战

一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩固! 二.测试步骤: 1.父类代码 1 package com.hafiz.zhang; 2 3 public class Fu 4 { 5 private int i = print("this is father common variable"); 6 private static

Thread类和Runnable接口实现多线程--2019-4-18

1.通过Thread实现 public class TestThread extends Thread{ public TestThread(String name) { super(name); } public void run() { for(int i = 0;i<5;i++){ for(long k= 0; k <100000000;k++); System.out.println(this.getName()+" :"+i); } } public static

java中利用JOptionPane类弹出消息框的部分例子

转: http://www.cnblogs.com/wangxiuheng/p/4449917.html http://blog.csdn.net/penjie0418/article/details/9257917 只想要一个确认按钮, It's the JOptionPane.DEFAULT_OPTION JOptionPane.showConfirmDialog(null, "MESSAGE", "TITLE", JOptionPane.DEFAULT_OPT

探Java多线程Thread类和Runnable接口之间的联系

首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情况 情况1: 继承Thread类.重写其方法run() .    然后new之.调用Start()方法 1 public class TestThread 2 { 3 private int i; 4 public static void main(String[] args) 5 { 6 // T

Java多线程和并发(三),Thread类和Runnable接口

目录 1.Thread和Runnable接口 三.Thread类和Runnable接口 1.Thread和Runnable接口 原文地址:https://www.cnblogs.com/xzmxddx/p/10362804.html

Java中的嵌套类和内部类

以前看<Java编程思想>的时候,看到过嵌套类跟内部类的区别,不过后来就把它们的概念给忘了吧.昨天在看<数据结构与算法分析(Java语言版)>的时候,又遇到了这个概念,当时就很大的疑惑:嵌套类跟内部类有什么区别?只有是否有关键字static的区别吗? 所以今天找了个时间查了一下两者的详细区别,总结在这篇博客中,既方便自己的复习和学习,也启示他人吧. 1,概念: 定义在一个类内部的类,叫作"嵌套类".嵌套类分为两种:static的和非static的.后者又有一个专

【Java】Java中的Collections类——Java中升级版的数据结构【转】

一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数组无法完全表达你要表达的东西,而定义一个类Class有太过麻烦,这时候,你可以考虑一下用Java中的Collections类.使用Collections类,必须在文件头声明import java.util.*;   一.动态.有序.可变大小的一维数组Vector与ArrayList Collecti