创建线程的第一种方式:

  1. 创建一个类继承Thread
  2. 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置。)
  3. 创建子类对象,其实就是在创建线程
  4. 启动线程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();
}
}

为了解决四个线程共享票的问题,需要使用创建线程的第二种方式:

  1. 创建实现了Runnable接口的子类
  2. 重写Runnable接口中的run方法
  3. 创建实现了Runnable接口的子类的对象
  4. 创建Thread类的对象,也就是在创建线程
  5. 把实现了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中创建线程的两种方式的更多相关文章

  1. 【java并发】传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  2. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  3. Java值创建线程的两种方式对比

    在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...

  4. Java中创建线程的三种方式以及区别

    在java中如果要创建线程的话,一般有3种方法: 继承Thread类: 实现Runnable接口: 使用Callable和Future创建线程. 1. 继承Thread类 继承Thread类的话,必须 ...

  5. Java中创建String的两种方式

    1.在Java中,创建一个字符串有两种方式 String x = "abc";String y = new String("abc"); 这两种方式有什么区别呢 ...

  6. java中创建字符串的两种方式(“”与new String())及区别

    结论:通过""创建的字符串实际上在java堆中只有一个,而通过new string创建出来的字符串在java堆中占有不同的内存. 第一个True表明这两个在内存中拥有相同的地址,那 ...

  7. Java多线程——创建线程的两种方式

    创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程 ...

  8. Java中创建String的两种方式差异

    我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd"; String str2 = new String("abcd&qu ...

  9. Java中创建线程的三种方式及其优缺点

    1.自定义一个继承Thread的类,由于Java的单继承特性,限制了该类的扩展性. 2.实现Runnable接口,重写run()方法. 3.实现Callable接口,重写call方法.线程执行体可以有 ...

随机推荐

  1. java的几种for循环方法

    自从jdk升级为1.8以后,for循环又升级了 classic for classic foreach List.forEach() List.stream().forEach() List.para ...

  2. nginx 安全漏洞 (CVE-2013-4547)

    Nginx 的安全限制可能会被某些请求给忽略,(CVE-2013-4547). 当我们通过例如下列方式进行 URL 访问限制的时候,如果攻击者使用一些没经过转义的空格字符(无效的 HTTP 协议,但从 ...

  3. Centos 6.5中使用yum安装jdk

    默认会有open-jdk的安装 我们需要卸载 卸载过程: 查找rpm安装包 rpm –aq|grep java; 卸载 rpm –e –nodeps 安装包 查看目前是否通过yum进行安装jdk yu ...

  4. spring log4j.properties

    log4j.properties log4j.rootLogger=info,appender2,appender3 #appender2\u914D\u7F6E FileAppender log4j ...

  5. 两种应该掌握的排序方法--------1.shell Sort

    先了解下什么都有什么排序算法 https://en.wikipedia.org/wiki/Sorting_algorithm http://zh.wikipedia.org/zh/%E6%8E%92% ...

  6. 如何使用eclipse进行嵌入式Linux的开发

    如何使用eclipse进行嵌入式Linux的开发 作者:曾宏安,华清远见嵌入式学院高级讲师. 如何使用eclipse进行嵌入式Linux的开发 习惯了在windows环境下开发的程序员在转到Linux ...

  7. win7下的vxworks总结

    在visualbox下运行vxworks 先来看一张效果图: 在tornado端 成功运行第一个程序,输出了visualbox can run the vxworks ! 在vmware下的速度快多了 ...

  8. 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码

    跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手-打开新的Image Acquisitio ...

  9. 【JS】Beginner2:Variables & Data

    1.Variables name :name it in a way that tells what you've stored there value: 2.Create a variable =& ...

  10. 解决Hadoop-Eclipse-Plugin放在Plugin目录下没反应的问题

    有时候自己编译或者下载的Hadoop-Eclipse-Plugin放到Eclipse的Plugin目录下面,启动Eclipse没有反应,即看不到小象和Map/Reduce视图.可以通过查看Eclips ...