Java中创建线程的两种方式
创建线程的第一种方式:
- 创建一个类继承Thread
- 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置。)
- 创建子类对象,其实就是在创建线程
- 启动线程start()
这种方式的特点(缺陷):线程任务和线程是绑定在一起的。
示例:
四个窗口同时卖票,
因为是同时,所以使用多线程。
创建四个线程,都是卖票。
因为都是卖票,所以四个线程的任务是一样的。
只需要定义一个类继承Thread。
class Ticket extends Thread
{
private static int num = 50; //定义成static,四个线程共享50张票。
public void run()
{
while(num>0)
System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
}
} class Maipiao
{
public static void main(String[] args)
{
Ticket win1 = new Ticket();
Ticket win2 = new Ticket();
Ticket win3 = new Ticket();
Ticket win4 = new Ticket(); win1.start();
win2.start();
win3.start();
win4.start();
}
}
为了解决四个线程共享票的问题,需要使用创建线程的第二种方式:
- 创建实现了Runnable接口的子类
- 重写Runnable接口中的run方法
- 创建实现了Runnable接口的子类的对象
- 创建Thread类的对象,也就是在创建线程
- 把实现了Runnable接口的子类对象作为参数传递给Thread类的构造方法
这种方式的特点是:把线程任务进行了描述,也就是面向对象,从而实现了线程任务和线程对象的分离。线程执行什么任务不再重要,只要是实现了Runnable接口的子类对象都可以作为参数传递给Thread的构造方法,此方式较为灵活。
第二种方式还有一个好处是实现接口了,还不影响继承其他父类。
//这个类只是为了描述线程的任务,跟线程没有任何关系。
class Ticket implements Runnable
{
private int num = 50;
public void run()
{
while(num>0)
System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
}
} class Maipiao
{
public static void main(String[] args)
{
Ticket t = new Ticket(); Thread win1 = new Thread(t);
Thread win2 = new Thread(t);
Thread win3 = new Thread(t);
Thread win4 = new Thread(t); win1.start();
win2.start();
win3.start();
win4.start();
}
}
总结:为什么创建线程的第二种方式可以解决卖票问题?
第一种创建线程的方式:线程和线程任务是绑定在一起的,创建了4个线程就创建了4份资源。
第二种创建线程的方式:线程和线程任务进行了分离,只需要创建一个任务,让4个线程分别去执行。
Java中创建线程的两种方式的更多相关文章
- 【java并发】传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- Java并发基础01. 传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- Java值创建线程的两种方式对比
在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...
- Java中创建线程的三种方式以及区别
在java中如果要创建线程的话,一般有3种方法: 继承Thread类: 实现Runnable接口: 使用Callable和Future创建线程. 1. 继承Thread类 继承Thread类的话,必须 ...
- Java中创建String的两种方式
1.在Java中,创建一个字符串有两种方式 String x = "abc";String y = new String("abc"); 这两种方式有什么区别呢 ...
- java中创建字符串的两种方式(“”与new String())及区别
结论:通过""创建的字符串实际上在java堆中只有一个,而通过new string创建出来的字符串在java堆中占有不同的内存. 第一个True表明这两个在内存中拥有相同的地址,那 ...
- Java多线程——创建线程的两种方式
创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程 ...
- Java中创建String的两种方式差异
我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd"; String str2 = new String("abcd&qu ...
- Java中创建线程的三种方式及其优缺点
1.自定义一个继承Thread的类,由于Java的单继承特性,限制了该类的扩展性. 2.实现Runnable接口,重写run()方法. 3.实现Callable接口,重写call方法.线程执行体可以有 ...
随机推荐
- 基于dojo模板的widget
参考:http://niweiwei.iteye.com/blog/1539863 http://dojotoolkit.org/reference-guide/1.8/dijit/_Template ...
- 捉虫记:SHGetSpecialFolderPath返回错误码为2
通常我们想获得系统的一些路径时,都会使用一些Shell函数.比如SHGetSpecialFolderPath,SHGetFolderPath,SHGetKnownFolderPath等,传入我们想要的 ...
- 【HDOJ】3509 Buge's Fibonacci Number Problem
快速矩阵幂,系数矩阵由多个二项分布组成.第1列是(0,(a+b)^k)第2列是(0,(a+b)^(k-1),0)第3列是(0,(a+b)^(k-2),0,0)以此类推. /* 3509 */ #inc ...
- hadoop 序列化源码浅析
1.Writable接口 Hadoop 并没有使用 JAVA 的序列化,而是引入了自己实的序列化系统, package org.apache.hadoop.io 这个包中定义了大量的可 ...
- write & read a MapFile(基于全新2.2.0API)
write & read a MapFile import java.io.IOException; import org.apache.hadoop.io.IntWritable; imp ...
- MongoDB实战开发 【零基础学习,附完整Asp.net示例】
MongoDB实战开发 [零基础学习,附完整Asp.net示例] 阅读目录 开始 下载MongoDB,并启动它 在C#使用MongoDB 重构(简化)代码 使用MongoDB的客户端查看数据 使用Mo ...
- druid简单教程
java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也 ...
- 洛谷P1117 棋盘游戏
洛谷1117 棋盘游戏 题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子.现在给出一个初始棋盘和一个最终棋盘,要 ...
- HIVE中查询FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Communications link failure
有一天早上到公司用hive中查询数据,发现报错不能连接.通过检查发现mysql服务器没有启动,开启mysql服务器后查询正常.
- HW5.7
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...