------- android培训、java培训、期待与您交流! ----------

创建线程的第一种方式:继承Thread类。
步骤:
1,定义类继承Thread。
2,复写Thread类中的run方法。
目的:将自定义代码存储在run方法。让线程运行。

3,调用线程的start方法,
该方法两个作用:启动线程,调用run方法。

创建线程的第二种方式:实现Runable接口

步骤:
1,定义类实现Runnable接口
2,覆盖Runnable接口中的run方法。
将线程要运行的代码存放在该run方法中。

3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
为什么要将Runnable接口的子类对象传递给Thread的构造函数。
因为,自定义的run方法所属的对象是Runnable接口的子类对象。
所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。

5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

实现方式和继承方式有什么区别呢?

实现方式好处:避免了单继承的局限性。
在定义线程时,建立使用实现方式。

两种方式区别:
继承Thread:线程代码存放Thread子类run方法中。
实现Runnable,线程代码存在接口的子类的run方法。

范例:

public class Test1 {public static void main(String[] args) {for(int i=0;i<3;i++){new Thread(new Mess()).start();}}
}class Mess implements Runnable{private static int taskcount = 0;private final int id = taskcount ++;Mess(){System.out.println("new message"+id);}@Overridepublic void run() {System.out.println("r1:"+id);Thread.yield();  //对线程调度器的一种建议System.out.println("r2:"+id);Thread.yield();System.out.println("r3:"+id);Thread.yield();System.out.println("end"+id);}
}

=========================================================

Java对于多线程的安全问题提供了专业的解决方式。

就是同步代码块。

synchronized(对象)
{
需要被同步的代码

}
对象如同锁。持有锁的线程可以在同步中执行。
没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。

同步规则(何时使用同步):如果正在写一个变量,他可能接下来被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,必须使用同步,并且,读写线程都必须用相同的监视器锁同步。

同步函数的锁是this
静态同步函数的锁是Class对象。

public class Test1 {public static void main(String[] args) {for(int i=0;i<3;i++){new Thread(new Mess()).start();}}
}class Mess implements Runnable{private static int taskcount = 0;private final int id = taskcount ++;Mess(){System.out.println("new message"+id);}@Overridepublic void run() {System.out.println("r1:"+id);Thread.yield();  //对线程调度器的一种建议System.out.println("r2:"+id);Thread.yield();System.out.println("r3:"+id);Thread.yield();System.out.println("end"+id);}
}

=======================================================

等待/唤醒机制
涉及的方法:
1.wait():让线程处于冻结状态,被wait的线程会被存储到线程池中。
2.notify():唤醒线程池中的一个线程(任意)。
3.notifyAll():唤醒线程池中的所有线程。

这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法,
必须要明确到底操作的是哪个锁上的线程。

为什么操作线程的方法 wait、notify、notifyAll定义在了Object类中?
因为这些方法是监视器的方法,监视器其实就是锁。
锁可以是任意的对象,任意的对象调用的方法一定定义在Object类中。

========================================================
Lock接口
将同步和锁封装成了对象,并将操作锁的方式定义到了该对象中,将隐式动作变成了显式动作。
Lock lock=new ReentrantLock();
lock.lock();//获取锁
code...;//throw Exception();
lock.unlock();//释放锁
try
{
lock.lock();//获取锁
}
finally
{
lock.unlock;//释放锁
}

Lock接口:它的出现替代了同步代码块或者同步函数。将同步的隐式锁操作变成了显式锁操作;
同时更为灵活,可以一个锁上加上多组监视器。
lock();获取锁
unlock();释放锁,通常需要定义到finally代码块中。

Condition接口:它的出现替代了Object中的wait、notify、notifyAll方法。
将这些监视器方法单独进行了封装,变成了Condition监视器对象,
可以和任意锁组合。
await();//等待
signal();//唤醒一个等待线程
signalAll();//唤醒所有等待线程

import java.util.concurrent.locks.*;class ProducerConsumerDemo2
{public static void main(String[] args) {Resource r = new Resource();Producer pro = new Producer(r);Consumer con = new Consumer(r);Thread t1 = new Thread(pro);Thread t2 = new Thread(pro);Thread t3 = new Thread(con);Thread t4 = new Thread(con);t1.start();t2.start();t3.start();t4.start();}
}
class Resource
{private String name;private int count = 1;private boolean flag = false;//  t1    t2private Lock lock = new ReentrantLock();private Condition condition_pro = lock.newCondition();private Condition condition_con = lock.newCondition();public  void set(String name)throws InterruptedException{lock.lock();try{while(flag)condition_pro.await();//t1,t2this.name = name+"--"+count++;System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);flag = true;condition_con.signal();}finally{lock.unlock();//释放锁的动作一定要执行。
        }}//  t3   t4  public  void out()throws InterruptedException{lock.lock();try{while(!flag)condition_con.await();System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);flag = false;condition_pro.signal();}finally{lock.unlock();}}
}class Producer implements Runnable
{private Resource res;Producer(Resource res){this.res = res;}public void run(){while(true){try{res.set("+商品+");}catch (InterruptedException e){}}}
}class Consumer implements Runnable
{private Resource res;Consumer(Resource res){this.res = res;}public void run(){while(true){try{res.out();}catch (InterruptedException e){}}}
}

===============================================================================

interrupt() 将处于强制冻结状态的线程,恢复到运行状态并处理InterruptedException

public class InterruptDemo {public static void main(String[] args) {Thread t = new Thread(new Demo());t.start();System.out.println("Start");t.interrupt();}
}class Demo implements Runnable{private boolean flag  = true;@Overridepublic synchronized void run() {while(flag){try {wait();} catch (InterruptedException e) {System.out.println("interrupted");flag = false;//通过修改标志位,让线程停止
            }}System.out.println("end");}
}

=======================================================

守护线程: t1.setDaemon(true);
t1.start();
将线程声明为守护线程。(当前台线程停止时,守护线程强行停止)

join:
当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。
join可以用来临时加入线程执行。

class Demo2 implements Runnable
{public void run(){for(int x=0; x<70; x++){System.out.println(Thread.currentThread().toString()+"....."+x);Thread.yield();}}
}public class JoinDemo
{public static void main(String[] args) throws Exception{Demo2 d = new Demo2();Thread t1 = new Thread(d);t1.start();t1.join();for(int x=0; x<40; x++){System.out.println("main....."+x);}System.out.println("over");}
}

优先级:setPriority(Thread.MAX_PRIORITY);//设置到最高优先级
线程组:每个线程属于其创建者所在的线程组。调用线程的toString方法可以看到其线程组。

转载于:https://www.cnblogs.com/grjelf/archive/2012/10/19/2726502.html

黑马程序员5 多线程相关推荐

  1. 黑马程序员_Java_多线程

    线程的理解 1.同一个应用中,多个任务同时进行.就像editplus编辑工具,打开一个文件窗口就是一个线程. 2.线程可以有多个,但cpu每时每刻只做一件事(多核除外).由于cpu处理速度很快,我们就 ...

  2. 黑马程序员—C#多线程

    ----------------------Windows Phone 7手机开发..Net培训.期待与您交流! ---------------------- 通过几天的学习,对多线程有了初步的了解, ...

  3. 黑马程序员——Java 多线程

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Java 多线程 1.多线程概述 多线程概述 进程: 正在运行的程序,是系统进行资源分配和调用的 ...

  4. [置顶] 黑马程序员 -- 多线程

    黑马程序员 -- 多线程 polk601001 星期五, 15/06/2012 - 17:14 发布 什么是多线程? 多线程就是使程序并发(同时)执行几个操作. .NET 框架类库在System.Th ...

  5. 黑马程序员,黑马论坛-----多线程知识点总结

    来源:黑马程序员,黑马论坛 创建: 方式一:继承Thread类 步骤: 继承Thread覆写run( )方法 通过Thread子类创建线程对象 调用start( );方法开启线程执行run( ) 方式 ...

  6. 【C++学习汇总】【黑马程序员】

    [C++学习汇总] 1 黑马程序员 2 深蓝学院 3 自发式收集学习 1 黑马程序员 [C++][第一篇][黑马 p84 - p105 ][引用][重载][类和对象-struct.class] [C+ ...

  7. 黑马程序员入学Java知识——精华总结

    黑马程序员入学Java知识--精华总结 J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结! 一.黑马程序员-java概述与基础知识 6 1.何为编程? 6 2.Java语言 ...

  8. Java教程-黑马程序员版

    很多初学Java的小伙伴,在选择Java教程的时候有很多困惑.哪一套Java教程更适合入门?某一个技术学完之后能做什么?黑马程序员为大家整理了2022年Java教程的选择建议.希望对大家有帮助~ 如果 ...

  9. 黑马程序员训练营十道满分题解

    黑马程序员训练营基础测试题十道 代码下载见GitHubs:https://github.com/fairyxingyun/Itheima_exam_10_answer 1. 编写一个函数,函数内输出一 ...

最新文章

  1. pyinstaller打包生成的exe文件(并设置运行时静默)
  2. Qt QML 实现Android相册展示
  3. 汇编中断知识之INT 1CH
  4. struts2学到屎挫死-深入Struts2(2)--Action
  5. 如何在外网访问家里电脑上的文件?
  6. 单片计算机基础及应用答案,单片机原理及应用课后习题参考答案1~6章(DOC)
  7. 家庭一台电脑多人上网方法
  8. php获取客户端IP地址的几种方法
  9. jclasslib插件_JVM-工具安装-jclasslib-win64
  10. Flink报错 Could not instantiate the executor_ Make sure a planner module is on the classpath
  11. Android Weekly #33 :这个世界的问题,在于聪明人充满疑惑,而傻子们坚信不疑
  12. 判断当前时间是否是法定节假日或工作日
  13. 女神在我玩王者的时候约我看电影,可我又不能挂机坑队友。那就只能写一个帮我打王者荣耀的AI了
  14. android canvas添加文字居中,android Canvas drawText 文字居中
  15. 一文分析 Web3 尚未被主流采用的 6 个主要原因
  16. 电脑显示没有被指定在上运行_win10系统运行QQ时出现“.dll没有被指定在windows上运行,或者它包含错误”的解决教程...
  17. OmniGraffle Pro for Mac v7.10.2 画图制图软件 中文破解版下载
  18. GitHub统计代码量
  19. Azure Kinect获取相机内参
  20. WayOS路由器电信网通双线的设置方法

热门文章

  1. android检测蓝牙设备连接不上,Android检查设备连接状态
  2. php列表显示教程,Dedecms后台管理文档列表显示自定义字段方法教程
  3. linux ssh权限漏洞,OpenSSH do_setup_env函数权限提升漏洞(CVE-2015-8325)
  4. java异常例子_java 异常的实例详解
  5. wordpress php教程 pdf,wordpress二次开发全能教程.pdf
  6. 2018java二级考试大纲_2018年全国计算机二级java考试简答题练习二
  7. python给用户输出提示_python3.4控制用户输入与输出的方法
  8. java查询mysql装载bean_jsp与javabean链接mysql数据库并查询数据表的简单实例源码
  9. C语言面试题-这些简单的你能很快的写出来吗?
  10. 数据结构与算法(3-1)栈(顺序栈、两栈共享空间、链栈、栈的计算器)