需求:我们要实现多线程的程序。
  如何实现呢?
  由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
  而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。
  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. Navicat for Oracle实现连接Oracle

    不知道为什么,从一开始,我就不喜欢Oracle,名字好听,功能强大,但总感觉"高不可攀";或许是因为我觉得其他的数据库就可以解决数据问题,不太了解Oracle的优势:而且它长得也不 ...

  2. MSCRM 用户登录日志

    MSCRM中关于用户登录信息,默认是不显示的,但是许多客户又有相关的需求. 下面将介绍给大家方法: 一.开启系统审核功能和用户访问审核. 二.打开设置中审核视图. 三.在过滤事件中选择“用户通过web ...

  3. spring+ibatis+多数据源

    环境:spring3.1+ibatis2.3.4+oracle+hbase要求:需要在工程中操作两个不同的数据源,一个是mssql,另一个是hbase.实现:    <bean id=" ...

  4. Autodesk的照片建模云服务—Autodesk ReCap 360 photo 的测试数据

    之前已经给大家介绍过了Autodesk的照片建模云服务—Autodesk ReCap 360 photo, 你也可以自己登录到http://recap360.autodesk.com/ 自己试一试. ...

  5. 腾讯bugly团队提供的android国内镜像

    腾讯bugly团队提供的国内镜像   如果使用Android SDK Manager下载比较慢或者打不开,可以使用国内镜像 使用说明 http://android-mirror.bugly.qq.co ...

  6. App Today Extension开发注意事项

    从iOS 8起,就有了App Extension.Extension的种类至今也扩充到了19种,应用也很广泛,值得重点关注起来. Extension几乎可以看做一个内嵌的独立App,拥有独立的Bund ...

  7. java field, property,variable及getField和getDeclaredField的区别

    java 里面的field ,property, attribute,variable的区别 field: 就是定义的用于保存数据的字段 property: property是用于描述类中的特征,所以 ...

  8. android环境搭建

    Android开发环境的两种安装方式:JDK+Eclipse+ADT直接下载集成的开发工具,解压即可用.下载地址:http://pan.baidu.com/s/1dD3s3bN ,不管采用哪种安装方式 ...

  9. classpath: 和classpath*:的区别

    classpath本质是jvm的根路径,jvm获取资源都是从该根路径下找的,注意这个根路径是个逻辑路径,并不是磁盘路径.比如两个jar包的路径是/a/a.jar和/b/b.jar,但是用classpa ...

  10. C#复习⑤

    C#复习⑤ 2016年6月19日 22:39 Main Inheritance 继承 1.继承的语法结构 class A { // base class int a; public A() {...} ...