实现线程并发有两种方式: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接口来解决单继承局限性、控制多线程程并发)的更多相关文章

  1. 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口

    //继承thread类 class PrimeThread extends Thread{ long minPrime; PrimeThread(long minPrime) { this.minPr ...

  2. Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)

    Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...

  3. 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类

    转自: http://blog.csdn.net/sunguangran/article/details/6069317 非常感谢原作者,整理的这么详细. 在java中可有两种方式实现多线程,一种是继 ...

  4. Java之同步代码块处理继承Thread类的线程安全问题

    package com.atguigu.java; /** *//** * 使用同步代码块解决继承Thread类的方式的线程安全问题 * * 例子:创建三个窗口卖票,总票数为100张.使用继承Thre ...

  5. Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

    1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...

  6. “全栈2019”Java多线程第二章:创建多线程之继承Thread类

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. Java通过继承thread类与实现Runnable接口实现多线程的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 一.通过继承T ...

  8. Android(java)学习笔记62:继承Thread类创建线程类

    package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分哪些代码能够被线程执行,java提供了T ...

  9. Java中实现多线程继承Thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

随机推荐

  1. NPOI基础入门(旧版本)

    1.常用的类与方法 工作本HSSFWorkbook 构造方法,无参表示创建一个新的工作本,可以接收一个流用于打开一个现有的工作本 方法CreateSheet(索引):创建指定索引的sheet对象 方法 ...

  2. 46. Permutations

    题目: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the fo ...

  3. 44. Wildcard Matching

    题目: Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single charact ...

  4. Java API —— DateFormat类

    1.DateFormat类概述         DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间. 是抽象类,所以使用其子类SimpleDateForm ...

  5. 24个有用的PHP类库分享

    目前,PHP是用于Web开发的最流行的脚本语言.你可以在互联网上随手找到关于PHP大量资料,包括文档.教程.工具等等.PHP不仅是一种功能丰富的语言,它还能帮助开发人员轻松地创建更好的网络环境.为了进 ...

  6. csv,txt,excel文件之间的转换,perl脚本

    最近接触一些需要csv,txt,excel文件之间的转换,根据一些网上搜索加上自己的改动,实现自己想要的结果为主要目的,代码的出处已经找不到了,还请见谅,以下主要是针对csv&excel 和t ...

  7. hdu 携程全球数据中心建设 (球面距离 + 最小生成树)

    题目 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib&g ...

  8. bzoj2561: 最小生成树

    如果出现在最小生成树上,那么此时比该边权值小的边无法连通uv.据此跑最小割(最大流)即可. #include<cstdio> #include<cstring> #includ ...

  9. UVALive 4043 Ants(二分图完美匹配)

    题意:每个蚁群有自己的食物源(苹果树),已知蚂蚁靠气味辨别行进方向,所以蚁群之间的行动轨迹不能重叠.现在给出坐标系中n个蚁群和n棵果树的坐标,两两配对,实现以上要求.输出的第 i 行表示第 i 个蚁群 ...

  10. 浅析Java中HashMap的实现

    概述 HashMap是一个散列表,是基于拉链法实现的.这个类继承了Map接口,Map接口提供了所有的哈希操作,比如set().put().remove()等,并且允许操作的键值对为null.HashM ...