黑马程序员_java08_多线程
转载于:http://www.itxuexiwang.com/plus/view.php?aid=148
线程是程序中可以并行执行的任务。 java运行系统总是选当前优先级最高的处于就绪状态的线程来执行。如果几个就绪线程有相同的优先级,将会用时间片方法轮流分配处理机。 进程与线程的区别 进程属于一个独立的运行程序,线程是程序里面的一个分支。许多个线程组成一个程序的运行。 创建线程的两种方式 (1)线程类是由Thread类及其子类表示的,继承Run()方法定义了线程执行时的任务体,定义一个继承于Thread的线程类覆盖run()方法。 (2)任何实现接口Runnable的对象都可以作为一个线程的目标对象,类Thread本身也实现了接口Runnable,接口中的run()方法需要实现为线程执行的任务体。 (3)可以利用Thread的类方法currentThread()获得当前执行线程的信息。 方法一: public class Person extends Thread{ public Person(String name){ this.name=name; } @Override public void run(){ super.run(); } } 1 2 3 4 5 6 7 8 9 方法二: class Res { private String name; private String sex; boolean flag=false; public synchronized void set(String name,String sex) { if (flag) { try{this.wait();} catch (Exception e){} } this.name=name; this.sex=sex; flag=true; this.notify(); } public synchronized void out() { if (!flag) { try { this.wait(); } catch (Exception e) { } System.out.println("name="+name+"\t"+"sex="+sex); flag=false; this.notify(); } } } class Input implements Runnable { private Res r; int x=0; Input(Res r) { this.r=r; } public void run() { while (true) { if (x==0) { r.set("Mike","man"); } else { r.set("丽丽","女女"); } x=(x+1)%2; } } } class Output implements Runnable { private Res r; Output(Res r) { this.r=r; } public void run() { while (true) { r.out(); } } } class ThreadDemo { public static void main(String[] args) { Res r=new Res(); new Thread(new Output(r)).start(); new Thread(new Input(r)).start(); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 与Thread类相比,利用实现Runnable接口定义线程类在使用中更加灵活。这时,实现接口Runnable的类可以继承其他父类。如果只要重写run() 方法,而不是重写其他Thread方法,那么应使用Runnable接口。 线程的同步 wait() 方法 当对象执行该方法时,正在访问此对象的线程将被阻塞,暂时停止运行,直到其他线程执行这个对象的notify()和notifyAll()方法,直到唤醒为止。唤醒后的线程应该继续对导致该线程被提醒的条件进行测试。 每个java对象都有一个锁,每个锁只有一把钥匙。 通常对象都没上锁,也没有在乎这件事。 但是如果对象有同步化的方法,则线程只能在取得钥匙的情况下进入线程。也就是说并没有其他线程已经进入的情况下才能进入。 线程的死锁 在多线程访问时,需要避免一些死锁。死锁往往是因为多线程共享资源,而共享资源的加锁顺序不当导致的。 守护线程 java语言中的线程有两种:守护线程和用户线程。用户线程都是在线程中创建。而守护线程有两种源,一种是虚拟机内部创建的线程,如垃圾回收的线程就守护线程;另一种是创建Thread对想后,可以调用Thread类的setDeamon的方法。指定该线程是守护线程。 守护线程是为用户线程服务的,当应用中没有任何用户线程运行时,虚拟机将退出。 class StopThread implements Runnable { private boolean flag=true; public synchronized void run() { while (flag) { try { wait(); } catch (InterruptedException e) { System.out.println(Thread.currentThread().getName()+"InterruptedException"); flag=false; } System.out.println(Thread.currentThread().getName()+"run running"); } } public void changeFlag() { flag=false; } } class StopThreadDemo { public static void main(String[] args) { StopThread st=new StopThread(); Thread t=new Thread(st); Thread t1=new Thread(st); t.setDaemon(true); t1.setDaemon(true); t.start(); t1.start(); int num=0; while (true) { if (num++==70) { break; } System.out.println(Thread.currentThread().getName()+"running............."+num); } } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 使用synchronized这个关键字修饰符可以防止两个线程同时进入一个对象的同一个方法。 对象就算是有多个同步化的方法,也还是一个锁。一旦某个线程进入该对象的同步化方法,其他线程就无法进入该对象上的任何同步化线程
黑马程序员_java08_多线程的更多相关文章
- 黑马程序员_Java_多线程
8.多线程 8.1.多线程概述 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程(例:FlashGet):就是进程中一个独立的控制单元.线 ...
- 黑马程序员:多线程Socket
---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ----------------------- 一.Socket一般应用模式(服 ...
- 黑马程序员:Java基础总结----网络编程
黑马程序员:Java基础总结 网络编程 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...
- 黑马程序员:轻松精通Java学习路线连载1-基础篇!
编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...
- 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具
Java学习路线图引言: 黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...
- 黑马程序员面试宝典(Java)Beta6.0免费下载
场景 JavaSE基础 面向对象特征以及理解 访问权限修饰符区别 理解clone对象 JavaSE语法 java有没有goto语句 &和&&的区别 如何跳出当前的多重嵌套循环? ...
- 黑马程序员——【Java高新技术】——代理
---------- android培训.java培训.期待与您交流! ---------- 一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法 ...
- 黑马程序员+SQL基础(上)
黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...
- 黑马程序员+Winform基础(上)
黑马程序员+Winform基础 ---------------<a href="http://edu.csdn.net"target="blank"> ...
随机推荐
- OD使用教程12
载入程序输入关键字: 双击进入程序 仔细看发现并没有跳转直接跳到这个mov,往上看发现retn上面有一个push,在这种编写手法当中这种组合相当于一个jmp, 跳到离它最近的一个值(在这就是004A5 ...
- 【转】linux yum命令详解
yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...
- iOS基础之网络请求相关
1.AFNetwork二次封装方法一: #import <Foundation/Foundation.h> @interface BeeNetworkManager : NSObject ...
- android开发中在界面上实现曲线图的几个开源项目
转自:https://wapiknow.baidu.com/question/1959128379041474620?qq-pf-to=pcqq.c2c 几个相关开源项目: 1. MPAndroid ...
- 1.本周的作业请参照此文:http://www.ruanyifeng.com/blog/2015/12/git-workflow.html 制定本组项目的GitHub版本更新流程---答题者:徐潇瑞
首先,介绍一下gitflow,它是最早诞生.并得到广泛采用的一种工作流程.如果采用git flow开发流程,那么项目存在两个常设分支,一个叫主分支master,另一个叫开发分支develop.mast ...
- git svn clone时间估算
处理器: Intel(R) Xeon(R) CPU E5-2620 @2.00GHz 2.00Ghz 内存:32.0 GB 操作系统: Windows Server 2008 R2 Enterpris ...
- poj3368(RMQ——ST)
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16543 Accepted: 5985 ...
- MyEclipse下XFire开发Webservice实例
XFire Java SOAP框架概述 (摘自:http://tech.it168.com/j/e/2006-10-28/200610281432707.shtml ) MyEclipse W ...
- .NET环境下上传和下载Word文件
一.上传Word文档或者其他文档 1.简单地上传文件的web服务方法如下 [WebMethod] public void UploadFile() { using (TransactionScope ...
- Spring 3种注入方式
spring的三种注入方式: 接口注入(不推荐) getter,setter方式注入(比较常用) 构造器注入(死的应用) 关于getter和setter方式的注入: autowire="de ...