java 22 - 4 多线程的代码实现的方式1
需求:我们要实现多线程的程序。
如何实现呢?
由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。
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的更多相关文章
- java 22 - 9 多线程之 代码实现的方式2
多线程的代码实现: 方式2:实现Runnable接口 步骤: A:自定义类MyRunnable实现Runnable接口 B:重写run()方法 C:创建MyRunnable类的对象 D:创建Threa ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- java 22 - 20 多线程之线程池
程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互. 而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池. 线程池里的每一个线程代码结束后 ...
- java 22 - 11 多线程之模拟电影院售票口售票
使用多线程实现的第二种方式: 首先创建自定义类 public class SellTicket implements Runnable { // 定义100张票 private int ticket ...
- Java并发和多线程2:3种方式实现数组求和
本篇演示3个数组求和的例子. 例子1:单线程例子2:多线程,同步求和(如果没有计算完成,会阻塞)例子3:多线程,异步求和(先累加已经完成的计算结果) 例子1-代码 package cn.fansuni ...
- java 22 - 21 多线程之多线程的代码实现方式3
JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法 A.public static ExecutorService newCachedThreadPool() B.public s ...
- java 22 - 10 多线程之两种代码实现方式的比较与区别
- java 22 - 12 多线程之解决线程安全问题的实现方式1
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...
- java 22 - 7 多线程之控制线程的方法
线程休眠(让线程休息一会再运行) public static void sleep(long millis) 在自定义线程类中添加该方法. 更改后,运行测试类,结果就是每执行完一轮,就休息1秒(这里设 ...
随机推荐
- SharePoint2007:解决第二回收站大数据无法删除问题
Emptying the Second Stage Recycle Bin in SharePoint 2007 Look in your second stage recycle bin in ...
- 判断scrollview是否滚动到了底部
调用函数判断如下:if(getScrollY() + getHeight() >= computeVerticalScrollRange()){ Log.d(TAG," ...
- IOS开发札记
//遍历所有的子控件,并打印其Frame +(NSString )searchAllSubviews:(UIView )superview { NSMutableString xml = [NSMut ...
- android MediaPlayer API大全已经方法详解(转载)
通过这张图,我们可以知道一个MediaPlayer对象有以下的状态: 1)当一个MediaPlayer对象被刚刚用new操作符创建或是调用了reset()方法后,它就处于Idle状态.当调用了rele ...
- 【代码笔记】iOS-拍照动画
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...
- DB2常用sql命令
DB2 清除数据库序列缓存 alter sequence wfr.wfr_bill_histories_s nocache; 创建清空所有表数据脚本select 'alter table '||RT ...
- 分组函数 ----group by 使用总结
总结:1,在where子句中不能用分组聚合函数. 2,如果没有group by 子句,select 不能同时出现字段与分组的聚合函数. 3,在有 group by 的子句的查询 ...
- informatica 学习日记整理
1. INFORMATICA CLIENT的使用 1.1 Repository Manager 的使用 1.1.1 创建Repository. 前提: a.在ODBC数据源管理器中新建一个数据源连接至 ...
- SSIS技巧--优化数据流缓存
问题 我们经常遇到一种情况,在SSMS中运行很慢的一个查询,当把查询转化成从源到目的数据库的SSIS数据流以后,需要花费几倍的时间!源和数据源都没有任何软硬件瓶颈,并且没有大量的格式转换.之前看了很多 ...
- Java并发之死锁实例
package com.thread.test.thread; /** * Created by windwant on 2016/6/3. */ public class MyTestDeadLoc ...