需求:我们要实现多线程的程序。
  如何实现呢?
  由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
  而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。
  Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。
  但是,Java可以去调用C/C++写好的程序来实现多线程程序。
   由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西,
  然后提供一些类供我们使用。我们就可以实现多线程程序了。
那么Java提供的类是什么呢?
Thread类
通过查看API,我们知道了有2种方式实现多线程程序。

方式1:继承Thread类。
步骤
  A:自定义类MyThread继承Thread类。
  B:MyThread类里面重写run()
    为什么是run()方法呢?     

  不是类中的所有代码都需要被线程执行的。
  需要被线程执行的代码,是那些执行时间较长的,而别的代码要等着它运行完后才能运行。
  所以这个时候,这种代码就需要被线程执行。
  而这个时候,为了区分哪些代码能够被线程执行,java提供了Thread类中的run()用来包含那些被线程执行的代码。

  C:创建对象
  D:启动线程

自定义MyThread类,并重写run()方法

 //注意:创建这个类时,要继承Thread类

 public class MyThread extends Thread {

     public void run() {

         for(int x = 0; x < 1000; x++){
System.out.println(x);
}
} }

测试:

首先我们试下用run()来运行

 // 创建线程对象
MyThread my = new MyThread();
// 启动线程
my.run();
my.run();

结果是:

  依旧是单线程执行,先是执行一次run(),把0-999打印完,然后再执行一次

为什么呢?  

  因为run()方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果
要想看到多线程的效果,就必须说说另一个方法:start()

这里有个面试题: 

  run()和start()的区别?
 run():仅仅是封装被线程执行的代码,直接调用是普通方法
 start():首先启动了线程,然后再由jvm去调用该线程的run()方法。

再试试start()方法:

 MyThread my = new MyThread();
my.start();
my.start();

执行结果: 提示IllegalThreadStateException错误 :非法的线程状态异常

原因:

  因为这个相当于是my线程被调用了两次。而不是两个线程启动。

再次更改:

 // 创建两个线程对象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread(); my1.start();
my2.start();

执行结果:同时执行2个打印0-1000的线程,打印出来的结果:线程1和线程2抢资源,抢到的就执行,这次你抢到,下次我抢到,输出结果也如此。

java 22 - 4 多线程的代码实现的方式1的更多相关文章

  1. java 22 - 9 多线程之 代码实现的方式2

    多线程的代码实现: 方式2:实现Runnable接口 步骤: A:自定义类MyRunnable实现Runnable接口 B:重写run()方法 C:创建MyRunnable类的对象 D:创建Threa ...

  2. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  3. java 22 - 20 多线程之线程池

    程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互. 而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池. 线程池里的每一个线程代码结束后 ...

  4. java 22 - 11 多线程之模拟电影院售票口售票

    使用多线程实现的第二种方式: 首先创建自定义类 public class SellTicket implements Runnable { // 定义100张票 private int ticket ...

  5. Java并发和多线程2:3种方式实现数组求和

    本篇演示3个数组求和的例子. 例子1:单线程例子2:多线程,同步求和(如果没有计算完成,会阻塞)例子3:多线程,异步求和(先累加已经完成的计算结果) 例子1-代码 package cn.fansuni ...

  6. java 22 - 21 多线程之多线程的代码实现方式3

    JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法 A.public static ExecutorService newCachedThreadPool() B.public s ...

  7. java 22 - 10 多线程之两种代码实现方式的比较与区别

  8. java 22 - 12 多线程之解决线程安全问题的实现方式1

    从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...

  9. java 22 - 7 多线程之控制线程的方法

    线程休眠(让线程休息一会再运行) public static void sleep(long millis) 在自定义线程类中添加该方法. 更改后,运行测试类,结果就是每执行完一轮,就休息1秒(这里设 ...

随机推荐

  1. Shapely中的几何图形操作

    Geometric Objects object.area Returns the area (float) of the object. object.bounds Returns a (minx, ...

  2. iOS/Android网络消息推送的实现两种方法

    移动时代,用户为王,而每个APP拥有的活跃用户量(Active Users),决定了其价值. 消息推送成为了不可或缺的活跃唤起工具. 目前消息推送有如下两种途径: 1.iOS传统方式: 通过Apple ...

  3. Understanding the Uncertain Geographic Context Problem

    "The areal units (zonal objects) used in many geographical studies are arbitrary, modifiable, a ...

  4. Java解析Soap XML

    package com.jstrd.tipstock.webservice.jt.base; import java.io.ByteArrayInputStream; import java.util ...

  5. JavaScript学习02 基础语法

    JavaScript学习02 基础语法 JavaScript中很多基础内容和Java中大体上基本一样,所以不需要再单独重复讲了,包括: 各种算术运算符.比较运算符.逻辑运算符: if else语句.s ...

  6. Android 触摸手势基础 官方文档概览

    Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...

  7. 图解Android触摸事件分发

    Android中触摸事件传递过程中最重要的是dispatchTouchEvent().onInterceptTouchEvent()和onTouchEvent()方法. View和Activity有d ...

  8. 【代码笔记】iOS-调用系统震动和声音

    代码: RootViewController.m #import "RootViewController.h" #import <AudioToolbox/AudioTool ...

  9. 截取UIImage指定大小区域

    截取UIImage指定大小区域 最近遇到这样的需求:从服务器获取到一张照片,只需要显示他的左半部分,或者中间部分等等.也就是截取UIImage指定大小区域. UIImage扩展 我的解决方案是对UII ...

  10. android 进程/线程管理(一)----消息机制的框架

    一:android 进程和线程 进程是程序运行的一个实例.android通过4大主件,弱化了进程的概念,尤其是在app层面,基本不需要关系进程间的通信等问题. 但是程序的本质没有变,尤其是多任务系统, ...