多线程--百度百科:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。 [1] 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。 自己理解:线程是CPU处理数据的最小单位。一个程序可以使单线程也可以是多线程,如果是多线程,那么就执行的更快。 为什么多线程会执行的更快:在单位时间片中,高速运转,切换线程。 1.在单位时间时间片上只能执行一个线程 2.CPU看到内存中有很多的线程,CPU在单位时间片(时间片:很微小的时间单位)上高速切换线程执行 CPU平均给线程分配资源,多线程就分配的更多资源 创建线程: 1.extends Tread public class PlayGameThread extends Thread{ public void run() { for (int i = 0; i < 100; i++) { System.out.println("double kill..."); } } } public class MusicThread extends Thread{ public void run() { for (int i = 0; i < 100; i++) { System.out.println("摩擦。。。摩擦..."); } } } public class Test { public static void main(String[] args) { PlayGameThread pgt = new PlayGameThread(); MusicThread mt = new MusicThread(); pgt.start(); mt.start(); } } 2.implement Runnable public class TicketThread implements Runnable{ private int num = 50; public void run() { // 最终的代码 while(num>0){ System.out.println("您的票号是:"+num); num--; } } } public class Test { public static void main(String[] args) { /* * 只需要创建一个TicketThread的对象 tt * 以tt为参数来创建3个Thread对象 */ TicketThread tt = new TicketThread(); Thread t1 = new Thread(tt); Thread t2 = new Thread(tt); Thread t3 = new Thread(tt); t1.start(); t2.start(); t3.start(); } } Tread类中一些常用的方法: 1.sleep睡眠:线程类Thread当中有一个static void sleep(long millis)方法,在指定的毫秒数内让当前正在执行的线程休眠。 2.优先级:线程的优先级:每个线程[线程对象]都有一个优先级,高优先级线程的执行优先于低优先级线程(简单说:如果一个线程的优先级越高,获得CPU资源的机会更大,不等于高优先级的就最先执行)。 3.守护线程: 1)、守护线程(精灵线程/后台线程) ①每个线程都可以或不可以标记为一个守护程序 ②后台线程仅仅就是对线程的一个分类或者标记 2)、特点: ① 一般来说后台线程是为前台线程服务的(例如gc线程); ② 如果所有的前台线程都死了,那么后台线程也会自动的死亡;但是前台线程死了,后台线程不一定立即死亡(可能还需要收尸...) ③ 一个线程的默认状态和创建它的环境线程状态一致 public static void main(String[] args) { Thread t = Thread.currentThread(); System.out.println(t.isDaemon()); t.setDaemon(true);//活动状态的线程不能够修改后台线程 Thread tt = new Thread(); System.out.println(tt.isDaemon()); //tt.start();//活动的线程不能改变状态Exception in thread "main" java.lang.IllegalThreadStateException tt.setDaemon(true); System.out.println(tt.isDaemon());//自定义线程未启动可设置后台线程 } 4.join等待终止:join为线程当中的方法,某线程实例调用该方法,其他线程会等待该线程执行完毕之后在执行。 5.礼让yield:static void yield() 暂停当前正在执行的线程对象,并执行其他线程。但是不一定会一定礼让。 线程中经典的售票案例: 票池:50张。3个窗口售卖 1.票,用什么来存放票:票池 可以使用一个变量来表示票池,当卖出一个张票,该变量就自减一次 int num = 50; 2.本质就是要创建启动线程(流程) 明确需要把什么事情封装成独立的线程对象 卖(一张)票的操作 怎么操作? 判断是否有票,如果有票就卖一张 票总数减一 3.怎么实现: 自定义一个类 extends Thread类 实现功能自定义类覆写Thread类当中的run方法,实现伪代码功能 创建线程对象调用start方法启动线程 1.共享问题,用来存放票量的,变量应该如何被多个窗口共享 2.应该自定义几个类?1个类 之前游戏有不同功能,写了不同类,卖票都是一个功能,所以定义一个类就行了 3.应该创建几个对象?3个对象 三个窗口,可以创建三个对象来表示三个窗口 代码实现: ①同步代码块 synchronized (mutex) { //需要被保护的代码块 } 实例: while(num>0){//只要有票就卖 synchronized (TicketThread.class) {//同步监听,同一个对象 if(num > 0){//锁住了此流程,从synchronized进入一个就关闭,等一个结束完了,然后又打开再进入第二个 System.out.println(getName()+"还剩的票数为:"+num); num--; } } } ②同步方法 public static synchronized void saleOne(){//加上synchronized为同步监听方法,静态方法!可加可不加根据需求 if(num>0){//卖一张票的操作【业务角度各自的】 System.out.println(Thread.currentThread().getName()+":您的票号是:"+num); num--; } } ③锁机制 Lock 锁定代码块,保护代码块 Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); } 实例: while(num>0){//只要有票就卖 lock.lock();//开启锁 try {//被保护的代码 if(num>0){//卖一张票的操作【业务角度各自的】 System.out.println(getName()+":您的票号是:"+num); num--; } } finally {//释放锁,让下一个进入 lock.unlock(); } } 在线程中的唤醒与等待:

Bank类//账户类 public class Bank { double qian; boolean empty = true;//true为空,则没钱 void save(){ synchronized (Bank.class) {//要用同一个对象,那么就是使用同一个同步监听 if(!empty){//当为false,那么就是有钱 //等待取钱先执行,直接让synchronized中的代码先不执行,执行另一个 try {//捕捉异常 Bank.class.wait();//表示前面用的对象,现在也在使用,在同一个对象下,使用同一个同步监听, //并且等待和唤醒也是可以在同一个同步监听中可以交替进行。 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("何杰存钱之前:"+qian); qian += 520;//此时为空,那么就存钱,对变量进行增 System.out.println("何杰存钱之后:"+qian); empty = false;//设置标识,当执行完存钱之后,那么现在就做一个标识,标识现在有钱 Bank.class.notify();//唤醒。使用对象去唤醒。当此程序执行完毕之后,唤醒另一个的程序 } } void get(){ synchronized (Bank.class) {//要用同一个对象,那么就是使用同一个同步监听,Bank.class为本类的对象引用 if(empty){//当为true则没钱,那么就要等待存钱执行 //等待,让存钱先执行 try { Bank.class.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("王雨取钱之前:"+qian); qian -= 520;//此时为false,则是有钱,有钱了然后对变量进行减 System.out.println("王雨取钱之后:"+qian); empty = true;//上面进行的是false运算,当运行完毕时,那么就更改为没钱,作为标识 Bank.class.notify(); } } } Save类//线程类 public class SaveMoney extends Thread { Bank bank; public SaveMoney(Bank bank) { this.bank = bank; } @Override public void run() { for (int i = 0; i < 20; i++) { bank.save(); } } } get类//线程类 public class GetMoney extends Thread { Bank bank; public GetMoney(Bank bank) { this.bank = bank; } @Override public void run() { for (int i = 0; i < 20; i++) { bank.get(); } } } Test类//测试类 public class Test {//测试类 public static void main(String[] args) { Bank bank = new Bank(); SaveMoney sav = new SaveMoney(bank); GetMoney get = new GetMoney(bank); sav.start(); get.start(); } } 线程的生命周期: ① 创建 ; 例如 Thread t = new Thread(); ② 就绪 ; 调用了start方法 t.start() ---> 告诉CPU我准备好了 ③ 运行 ; 获得CPU的资源,开始执行线程体中的代码 ④ 死亡 ; 有多种情况导致死亡, 1)例如线程体执行完毕(自然老死); 2)非自然死亡(异常没有处理好); 3)对象失去引用 4)对象被垃圾回收机制销毁 注意:① 休眠等操作可能导致正在运行的线程阻塞],阻塞完了(sleep完了)进入的是就绪状态,相互一一直等待,出现死锁! ② 一个线程死了就死了,不能够死而复生 线程定时任务: Timer timer = new Timer(); MyTimerTask myTimerTask = new MyTimerTask(); //安排了 一个TimerTask 子类线程任务 timer.schedule(myTimerTask, new Date(),5000); Thread.sleep(8000); timer.cancel();//取消任务

何杰月c语言课程,多线程 - 何杰leo的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. c语言平时作业完成的评价,C语言作业评价标准 - osc_fmg49rzg的个人空间 - OSCHINA - 中文开源技术交流社区...

    C语言作业评价标准 作业内容: 每周作业分为基础作业.挑战作业和预习作业: 基础作业为本周所学内容的巩固: 挑战作业包括但不仅限于所学知识的综合运用: 预习作业为下周所学内容的任务单,要求必须在课前完 ...

  2. java请模拟出双重定时器_Java多线程基础 - osc_czmaebyq的个人空间 - OSCHINA - 中文开源技术交流社区...

    ( 1 ) 传统使用类Thread和接口Runnable实现 1. 在Thread子类覆盖的run方法中编写运行代码 方式一 newThread(){ @Overridepublic voidrun( ...

  3. c语言处理字符串函数的头文件,C语言字符处理函数 - 20131125的个人空间 - OSCHINA - 中文开源技术交流社区...

    C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入.输出.合并.修改.比较.转换.复制.搜索几类. 使用这些函数可大大减轻编程的负担.用于输入输出的字符串函数,在使用前应包含头文件" ...

  4. c语言的文件打开模式,c语言文件打开模式 - osc_b2jf5efr的个人空间 - OSCHINA - 中文开源技术交流社区...

    (转载) 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式 只可以读 只可以写 读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ab rb+ (r+ ...

  5. java实现自举_实现语言的自举 - 沙枣的个人空间 - OSCHINA - 中文开源技术交流社区...

    几乎所有的语言项目,其核心都是用更底层的语言写的. 底层语言大部分是 C,C++,而扩展这门语言的核心,就要用另外一种语言 去写.这给语言设计者较大的挑战. 开发语言必须具备底层语言的编写能力,而为了 ...

  6. c语言里有队列函数没,C语言队列的实现 - osc_tf30cc36的个人空间 - OSCHINA - 中文开源技术交流社区...

    对于C语言的队列来说,也有顺序存储和链表存储两种方式. 顺序存储容量固定,链表存储随时分配释放更加灵活. 下面是链表实现的队列初始化.入队.出队函数实现: #include #include #inc ...

  7. C语言使用二维数组存储姓名,C语言二维数组 - osc_it9fazjn的个人空间 - OSCHINA - 中文开源技术交流社区...

    上节讲解的数组可以看作是一行连续的数据,只有一个下标,称为一维数组.在实际问题中有很多数据是二维的或多维的,因此C语言允许构造多维数组.多维数组元素有多个下标,以确定它在数组中的位置.本节只介绍二维数 ...

  8. c语言分号的转义字符,C语言中的转义字符 - osc_9gm4ypss的个人空间 - OSCHINA - 中文开源技术交流社区...

    C语言中的转义字符 在字符集中,有一类字符具有这样的特性:当从键盘上输入这个字符时,显示器上就可以显示这个字符,即输入什么就显示什么.这类字符称为可显示字符,如a.b.c.$.+和空格符等都是可显示字 ...

  9. lunixs 常用命令c语言,常用Lunix命令 - osc_271igh42的个人空间 - OSCHINA - 中文开源技术交流社区...

    计算机 1.硬件系统 输入单元.输出单元.算术逻辑单元.控制单元.记忆单元 中央处理单元:CPU(算术逻辑单元.控制单元) 电源.主板.CPU.内存(RAM).硬盘.(声卡.显卡.网卡)(集成在主板上 ...

最新文章

  1. 1012 The Best Rank
  2. 基因组行业重大事件介绍
  3. Android多工程(project)开发实例
  4. 咨询业或将危害电力信息化进程?
  5. 【机器学习基础】Python实现行转列?!超简单,赶快get起来
  6. java socket通信demo_Java Socket通信示例
  7. 离散实验偏序关系满足实验报告C语言,离散数学实验三:偏序关系中盖住关系的求取及格论中有补格的判定...
  8. 国学精典书籍阅读记录
  9. 基于visual Studio2013解决面试题之0702输出数字
  10. Golang实践录:命令行cobra库实例优化
  11. Kafka集群全部断开,然后重启时报“The broker is trying to join the wrong cluster. Configured zookeeper.connect……”问题
  12. Qt Creator 添加自定义注释
  13. c:递归算法的三个demo:八皇后问题、台阶问题、汉诺塔
  14. 压缩与解压缩 与多个安装文件的合并问题
  15. (一)跟我一起玩Linux网络服务:DNS服务——BIND(/etc/named.conf、/var/named)设置实现和解释...
  16. upx脱壳教程(buuctf逆向题新年快乐)
  17. 最好最实用的二次开发教程(dedeCMS,ecshop为例)
  18. Linux性能分析命令
  19. 【攻防世界7-12题】题解和解题心得
  20. 如何使用python批量压缩图片_使用python脚本批量压缩图片大小

热门文章

  1. makefile文件中的依赖关系理解
  2. 理解CPU/寄存器/内存三者关系
  3. 启明云端分享 | Sigmastar SSD201\SSD202D核心板在智能料理机方案的应用(4.3寸彩屏应用)
  4. ESP32彩屏GUI试玩
  5. J-Link 输出供电问题
  6. 计算机word基础知识菜单,Word试卷模板_电脑基础知识_IT/计算机_资料
  7. 沈阳工程 c语言题库,2017年沈阳航空航天大学航空航天工程学部823C语言程序设计考研仿真模拟题...
  8. python调用linux软键盘_在Linux中使用Python模拟键盘按键
  9. 软键盘挡住EditText
  10. 【Java】Struts2配置默认Action和配置Action的默认处理类