当前位置: 首页 > 编程日记 > 正文

黑马程序员5 多线程

------- 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

相关文章:

解决 mac ox 终端显示bogon 的问题

方法一. 将DNS设置为Google的DNS服务器地址 8.8.8.8 方法二. 在终端进行设置 sudo hostname yourname 转载于:https://www.cnblogs.com/yshuai/p/7911869.html

【组队学习】【26期】编程实践(Django网站开发)

编程实践&#xff08;Django网站开发&#xff09; 论坛版块&#xff1a; http://datawhale.club/c/team-learning/28-category/28 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-program/tree/master/Django 学习目标 从零开始搭建一个属于自己…

asp.net 防注入

http://www.cnblogs.com/zxlin25/archive/2009/03/09/1407237.html转载于:https://www.cnblogs.com/alwayscainiao/archive/2012/10/23/2735011.html

ui设计师要懂哪些B端设计原则?

UI设计师是一个非常广泛的职位&#xff0c;它所接触的工作内容是非常多的&#xff0c;其中B端的设计内容就是一种&#xff0c;产品设计对于不同行业、不同公司、不同决策者都会有很大的差异&#xff0c;没有最好的设计原则&#xff0c;只有最适合你产品的原则。今天小编就为大家…

StartOS 5.0 正式版发布

StartOS 5.0正式版发布了。 StartOS —— 是由东莞瓦力网络科技有限公司发行的开源操作系统&#xff0c;符合国人的使用习惯&#xff0c;预装常用的精品软件&#xff0c;操作系统具有运行速度快&#xff0c;安全稳定&#xff0c;界面美观&#xff0c;操作简洁明快 等特点。Star…

【组队学习】【26期】编程实践(Python办公自动化)

编程实践&#xff08;Python办公自动化&#xff09; 论坛版块&#xff1a; http://datawhale.club/c/team-learning/29-category/29 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-program/tree/master/OfficeAutomation 学习目标 了解通过pyth…

软件测试培训分享:性能测试的目的是什么

在软件测试培训中&#xff0c;讲师们会讲到关于性能测试这方面&#xff0c;很多人都不理解&#xff0c;性能测试的目的是什么?性能测试的目的是为了测试产品是否满足在需求说明书中规定的性能&#xff0c;是否达到用户的性能要求&#xff0c;发现产品存在的性能瓶颈&#xff0…

[Android Pro] 有关Broadcast作为内部类时注册的一些问题

很经常Broadcast都会写成一个Activity或者Service的内部类。这时候的注册和普通有点小区别。 有两种情况1、假如是再Manifest文件里面静态注册的话&#xff0c;需要注意。ex&#xff1a;<applicationandroid:icon"drawable/ic_launcher"android:label"string…

NCEPU:线下组队学习周报(008)

线下组队学习 经过一段时间的准备&#xff0c;我们组织的线下组队学习逐步进入正轨。欢迎华北电力大学保定校区的伙伴加入进来大家一起学习一起成长。 我们开展组队学习的内容为&#xff1a; &#xff08;1&#xff09;周志华的《机器学习》&#xff08;西瓜书&#xff09; …

shell脚本初级教学(从基本脚本开始学起)

shell脚本的意义就在于实现以后的自动化运维,Linux其实也是基于shell脚本的所以我今天给大家教两个简单的脚本,并且解释.第一个抽奖脚本:思路:首先创建一个vim文件[rootserver0 ~]# vim /root/choujiangjiaoben.sh // (sh结尾是给自己一个是shell脚本的注释) #!/bin/bash // (以…

UI设计培训分享:app图标设计要遵循哪些原则

APP图片设计是UI设计工作中经常会遇到的&#xff0c;一个好的APP产品&#xff0c;图标的设计是非常重要的&#xff0c;本期小编为大家分享的UI设计培训教程就是app图标设计要遵循哪些原则?来看看下面的详细介绍。 UI设计培训分享&#xff1a;app图标设计要遵循哪些原则? 一、…

如何使用netwokx进行复杂网络的中心性分析?

如何使用netwokx进行复杂网络的中心性分析&#xff1f; 这是本学期在大数据哲学与社会科学实验室做的第七次分享了。 第一次分享的是&#xff1a; 如何利用“wordcloudjieba”制作中文词云&#xff1f; 第二次分享的是&#xff1a; 如何爬取知乎中问题的回答以及评论的数据…

Redis 笔记系列(十一)——Redis的发布和订阅机制

2019独角兽企业重金招聘Python工程师标准>>> 本文说的redis功能没啥大用处&#xff0c;大家知道有这回事情就好&#xff0c;我一笔带过。 Redis的发布订阅 这是什么 进程间的一种消息通信模式&#xff1a;发送者(pub)发送消息&#xff0c;订阅者(sub)接收消息。 例如…

界面交互推荐-25个闪亮创意的404错误页面设计-你从中发现了什么

404错误页面是站长和用户都很不愿见到的页面&#xff0c;因为那意味着该网站不能访问。但404错误是没人能避免&#xff0c;如服务器出现问题&#xff0c;站内需要调整&#xff0c;收到攻击等,我们访问网站的时候&#xff0c;一旦遇到404提示&#xff0c;我们那时的感觉是相当差…

参加完Python培训可以做什么

大家都知道Python在互联网行业是很吃香的&#xff0c;但是参加完Python培训之后&#xff0c;很多人都不知道该从哪个职业方向做起&#xff0c;下面小编就为大家详细的介绍一下参加完Python培训可以做什么? 参加完Python培训可以做什么?目前来看&#xff0c;Python发展得还是不…

my domain

www.yyhcy.co.cc hcy.sourceforge.net转载于:https://www.cnblogs.com/nbalive2001/archive/2012/10/25/2738086.html

【青少年编程】【Scratch】04 事件模块

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

1.随机函数,计算机运行的基石

待地铁的时间-在区间(a,b)上均匀分布的随机函数 rnd(1)是产生一个p (0 rnd(1) x (b-a) a 增量 基数 // 进行一系列的重复独立试验&#xff0c;每个试验的结果只有二个&#xff0c; 一个结果出现的概率总是p&#xff0c;另一个结果总是q, 称为贝努利试验 至一个结果出现所进行…

java培训班如何选择

想要进军互联网行业&#xff0c;大多数人的选择都是java技术&#xff0c;java技术在互联网行业是非常稳定的&#xff0c;那么学习java技术的话&#xff0c;java培训班如何选择呢?来看看下面的详细介绍。 java培训班如何选择?主要参考以下几点&#xff1a; 第一&#xff0c;选…

谢文睿:西瓜书 + 南瓜书 吃瓜系列 4. 二分类线性判别分析

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 以往内容&#xff1a; 西瓜书公式推导讲解来了&#xff01;0. 导学1. 一…

二叉排序树的相关操作

#include <IOSTREAM.H> #include <STDLIB.H> //二叉树的生成和释放 typedef struct Node {int data;struct Node * pParent;struct Node * pLeftChild;struct Node * pRightChild; }Node;Node * Create_BTree(int *array,Node* pParentNULL)//二叉排序树的创建,按照…

IDEA的常用操作(快捷键)

Alt回车 导入包,自动修正 CtrlN 查找类 CtrlShiftN 查找文件 CtrlAltL 格式化代码 CtrlAltO 优化导入的类和包 AltInsert 生成代码(如get,set方法,构造函数等) CtrlE或者AltShiftC 最近更改的代码 CtrlR 替换文本 CtrlF 查找文本 CtrlShiftSpace 自动补全代码 Ctrl空格 代码提示…

UI设计培训分享:ui的字体怎么正确设置?

UI设计工作中&#xff0c;UI字体设计是非常重要且频繁使用的一个工作内容之一&#xff0c;对于字体的设计也是非常需要进行注意的&#xff0c;本期小编为大家介绍的UI设计培训内容就是关于ui的字体怎么正确设置?来看看下面详细介绍。 UI设计培训分享&#xff1a;ui的字体怎么正…

【译文转帖】用C#写COM组件 Building COM Objects in C#

说明: 我是一个C#程序员,但是有一次一个需求只能用C/C去写,恰好需要读取的数据存放在DB(SQL CE v3)里面,而我又不会C/C(关键是用OleDB访问DB,这个实在是繁琐),所以催生了用C#写一个COM组件,用C/C去调用的想法.可谓,很傻很天真.但是也是一种思路,如果MS提供C API的话,问题就简单…

apache 开启 gzip 压缩服务

2019独角兽企业重金招聘Python工程师标准>>> 1、打开 apache 的 "httpd.conf" 文件&#xff0c;找到以下这一行&#xff0c;将它前面的注释&#xff08;#&#xff09;去掉&#xff1a; LoadModule deflate_module modules/mod_deflate.so 2、在 httpd.con…

Scratch等级考试(二级)模拟题

青少年编程竞赛交流群已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

找Java培训机构有哪些评判标准

想要学习java技术&#xff0c;找java培训机构是大多数人的选择&#xff0c;目前市面上的java培训机构有很多&#xff0c;用什么评判标准来找到时候自己的机构呢?来看看下面小编为大家介绍的找Java培训机构有哪些评判标准? 找Java培训机构有哪些评判标准? 1.师资力量的标准 我…

Josephus问题

目的&#xff1a;练习下单链表和指针 &#xff08;OS 10.7 Xcode 4.2&#xff09; 代码如下&#xff1a; 1 #include <stdio.h>2 #include <stdlib.h>3 4 typedef struct lnode5 {6 int data;7 struct lnode *next; 8 }lnode;9 10 int main(void) 11 …

Datawhale组队学习周报(第017周)

本周&#xff08;05月31日~06月06日&#xff09;&#xff0c;第 25 期组队学习一共有 3 门开源课程&#xff0c;共组建了 3 个学习群&#xff0c;参与的学习者有 292 人&#xff0c;其中 web开发入门教程 已经结营&#xff0c;另外两门课程也在结营筹划中。 第 26 期组队学习也…

给一个ul列表中点击到的li赋予样式

2019独角兽企业重金招聘Python工程师标准>>> 效果如下&#xff0c;点那个那个获取样式,之前已经有样式的取消。 代码如下&#xff0c;我是在菜鸟教程上在线编辑的&#xff0c;所以就这样喽~ if判断不加也行 <!DOCTYPE html> <html> <head> ​ <…