JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)
实现线程并发有两种方式:1)继承Thread类;2)实现Runnable接口。
- 线程基础
1)程序、进程、线程;并行、并发。
2)线程生命周期:创建状态(new一个线程对象)、就绪状态(调用该对象的start()方法)、执行状态(run()方法体的执行)、阻塞状态(sleep()/wait()方法的调用)、终止状态(destroy()/stop()非正常结束、或、run()方法体跑完后正常结束)。 另外从阻塞状态到执行状态,可用方法notify()/notifyAll()。
- 定义自己的线程——继承Thread类
在Java里实现多线程,只需要我们继承Thread类,并且覆写run()方法来执行我们想要的逻辑代码即可,仅此而已!
public class MyThread extends Thread{...public void run(){...}...} Thread t=new MyThread(i);//创建状态 t.start();//就绪状态,start()方法会自动触发t对象的run()方法体的执行,从而进入执行状态;但是,至于什么时候执行、线程之间的执行顺序都是不可预测的了,完全有OS决定。
- 解决继承局限性(单继承)——实现Runnable接口
1)通过继承Thread类,可以实现多线程并发;但是由于Java的单继承,使得MyThread类不能再继承其他的父类。
2)可以通过实现Runnable接口的方法,这样不仅能够满足多线程并发,还能满足继承其它父类。
class Parent{...} public class MyThread extends Parent implements Runnable{...public void run(){...}...} Thread t=new Thread(new MyThread(i));//先实例化自定义类MyThread的对象,再通过该对象作为参数实例化Thread对象 t.start();//进而调用Thread对象的start()方法
- 控制多线程并发
1)sleep()方法——让线程休眠
try{ sleep(2000); }catch(InterruptedException e){...}//sleep()方法会抛出异常,所以要catch处理。
注意:sleep()方法在线程阻塞的过程中,并不释放自己已经占用的资源;所以说,sleep()虽然可以提高CPU资源利用率,但是也会增加发生死锁的可能性!
2)通过synchronized关键字声明同步,实现对临界资源的互斥访问
2.1)对访问互斥资源的方法添加synchronized关键字,实现互斥访问————synchronized方法
class SynObj{ public synchronized void synAdd(){a--...i++...} public synchronized void synMinus(){...i--...b++} }//每当线程调用用synchronized修饰的同步方法时,就获得了当前对象SynObj的锁资源,此时其他线程就不能再调用这个对象SynObj的同步方法了。
2.2)对访问互斥资源的方法添加synchronized关键字的缺陷是,a--,b++这些非互斥的资源也不能访问了。所以Java还提供了更好的方法————synchronized块
class SynObj{ Object o=new Object(); public void synAdd(){a--... synchronized(o){i++}...} public void synMinus(){...synchronized(o){i--}...b++} }//synchronized块通过指定一个无意义的新对象作为同步的令牌,而不是使用当前对象SynObj本身,这就保证了不用在方法的整个过程锁住SynObj对象,而只要在真正访问互斥资源的逻辑代码段锁住对象即可。
3)sleep()、wait()、notify()、notifyAll()
sleep():来自Thread类。sleep()方法在线程阻塞的过程中,并不释放自己已经占用的资源。
wait():来自Java类的父类Object类,由notify()唤醒。wait()方法在线程阻塞的过程中,会释放自己已经占用的资源。
notify():随机从因为wait()方法而被阻塞的多个线程中选择一个唤醒,至于选择哪一个是无法预测的。
notifyAll():
4)产生死锁的原因:多个进程竞争临界资源;进程推进顺序不当。
5)Java把线程分为10个优先级別,分别用1-10表示;数字越小优先级别越高,表示该线程运行的逻辑越紧要,系统会分配更多的CPU时间给高优先级线程(注意,不是一定先运行)。通过setPriority(i)、getPriority()来对优先级进行存取。
JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)的更多相关文章
- 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口
//继承thread类 class PrimeThread extends Thread{ long minPrime; PrimeThread(long minPrime) { this.minPr ...
- Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)
Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...
- 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类
转自: http://blog.csdn.net/sunguangran/article/details/6069317 非常感谢原作者,整理的这么详细. 在java中可有两种方式实现多线程,一种是继 ...
- Java之同步代码块处理继承Thread类的线程安全问题
package com.atguigu.java; /** *//** * 使用同步代码块解决继承Thread类的方式的线程安全问题 * * 例子:创建三个窗口卖票,总票数为100张.使用继承Thre ...
- Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别
1. Java中线程的创建有两种方式: (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...
- “全栈2019”Java多线程第二章:创建多线程之继承Thread类
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java通过继承thread类与实现Runnable接口实现多线程的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 一.通过继承T ...
- Android(java)学习笔记62:继承Thread类创建线程类
package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分哪些代码能够被线程执行,java提供了T ...
- Java中实现多线程继承Thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
随机推荐
- 一个java的DES加解密类转换成C#
原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //i ...
- Chrome中的消息循环
主要是自己做个学习笔记吧,我经验也不是很丰富,以前学习多线程的时候就感觉写多线程程序很麻烦.主要是线程之间要通信,要切线程,要同步,各种麻烦.我本身的工作经历决定了也没有太多的工作经验,所以chrom ...
- Windows下Sublime Text 默认打开方式问题解决办法
注册表的解决办法: 删除 HKEY_CURRENT_USER\Software\Classes\Applications下的Sublime_Text.exe项.你就发现可以设置为默认打开方式了
- Java API —— 多线程(2)
1.JDK5中Lock锁的使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对 ...
- json-lib 中关于null与"null"
总感觉json-lib里面关于null和"null"的处理非常不合理,或者说是bug,去了json-lib的网站,最后一次更新是10年了... 发现官方网站第一段就说json-li ...
- apk反编译(6)ProGuard 工具 android studio版官方教程[作用,配置,解混淆,优化示例]
ProGuard In this document Enabling ProGuard (Gradle Builds) Configuring ProGuard Examples Decoding O ...
- Protected Member Access
https://msdn.microsoft.com/en-us/library/bcd5672a.aspx 官方的说法The protected keyword is a member access ...
- TeeChart的X轴,使用伪装的时间
TeeChart曲线的X轴是时间,但是频率很高.没法完全显示. 例如,一秒钟有2000个点,那么点与点的间隔为0.5毫秒. 使用TChart类的GetAxisLabel事件, 函数手册上对此事件的解释 ...
- Python3 学习第一弹:基本数据类型
本人学习主要从<python基础教程第二版>,<dive into python3>等书籍,及一些网上大牛的博客中学习特别是Python官方文档<Python Tutor ...
- MyBatis 实践 -Mapper与DAO
MyBatis 实践 标签: Java与存储 MyBatis简介 MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架. MyBatis是对JDBC的封装,使开 ...