`

黑马程序员----多线程

阅读更多
多线程

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



1.什么是线程
线程就是程序执行时的一条路径
* 2.创建线程
定义类, 继承Thread, 重写run()方法, 创建该类对象, 调用start(), 程序就会开启新线程执行run()方法
定义类, 实现Runnable, 重写run()方法, 创建该类对象, 传入Thread类构造函数, 在Thread对象调用start()方法时, 开启新线程运行run()方法
对应代码:
//两种写法
public class Demo1 {

	public static void main(String[] args) {
		
	Thread t = new Thread(){
			public void run(){
				for(int i = 0;i<10;i++){
					System.out.println("i = "+i);
				}
			}
			
		};
		t.start();
		
		
		new Thread(new Runnable(){
			
			public void run(){
				for(int x = 0; x < 10;x++){
					System.out.println("x = "+x);
				}
			}
		}).start();
			
		
	}

}
3.Thread类常用方法
currentThread(), 获取当前的线程对象
getName(), setName(String), 获取和设置线程的名字
sleep(long), 控制线程休眠指定毫秒
setDaemon(boolean), 设置线程为守护线程, 不会单独运行. 守护线程必须在线程调用start()之前设置.
对应代码:

引用
public class Demo8 {

/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
ThTest th = new ThTest();


Thread t = new Thread(new Runnable(){
public void run(){
for(int x = 0;x<10;x++){
System.out.println("x = "+x);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});



for(int m = 0;m<5;m++){
System.out.println("m = "+m);
Thread.sleep(1000);
}


这四行代码房子for前与for后结果不一样
t.setDaemon(true);
th.setDaemon(true);
t.start();
th.start();

}

}

class ThTest extends Thread{
public void run(){
for(int i = 0;i<10;i++){
System.out.println("i = "+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
join(), 当前线程暂停, 加入一个线程, 等待这个线程执行结束之后, 当前线程继续
对应代码:
package cn.thread;

public class Demo9 {

	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub

		Thread t = new Thread(){public void run(){
			for(int i = 0;i < 10;i++){
				System.out.println("i = "+i);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}};
		t.start();
		for(int m = 0;m<10;m++){
			System.out.println("m = "+m);
			Thread.sleep(1000);
			if(m == 4){//当m = 4的时候m暂停,i运行到结束后,m才继续运行
				t.join();
			}
		}
		
		
	}
	
}
4.多线程同步
如果在多线程并发的时候, 我们希望某一段代码执行过程中不被其他线程打断, 那么就可以使用同步技术
同步的方式有两种:
a.同步代码块:
synchronized(锁对象){同步代码}, 多个线程在执行同步代码块时如果锁对象相同, 只能执行一个
对应代码:
package cn.thread;

public class Demo3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final Happ h = new Happ();
		new Thread(new Runnable(){
			public void run(){
				while(true){
					h.happ();
				}
			}
			
		}).start();
		
		new Thread(new Runnable(){
			public void run(){
				while(true){
					h.toHappy();
				}
			}
		}).start();
		
	}

}

class Happ{
	private Object lock = new Object(); 
	public void happ(){
		synchronized(lock){
			System.out.print("圣");
			System.out.print("诞");
			System.out.print("快");
			System.out.println("乐");
		}
	}
	
	
	public void toHappy(){
		synchronized(lock){
			System.out.print("元");
			System.out.print("旦");
			System.out.print("快");
			System.out.println("乐");
		}
	}
}

b.同步方法:
在方法签名上加入synchronized修饰, 那么整个方法都被同步, 使用的锁对象是this
package cn.thread;

public class Demo3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final Happ h = new Happ();
		new Thread(new Runnable() {
			public void run() {
				while (true) {
					h.happ();
				}
			}

		}).start();

		new Thread(new Runnable() {
			public void run() {
				while (true) {
					h.toHappy();
				}
			}
		}).start();

	}

}

class Happ {

	public synchronized void happ() {

		System.out.print("圣");
		System.out.print("诞");
		System.out.print("快");
		System.out.println("乐");

	}

	public synchronized void toHappy() {

		System.out.print("元");
		System.out.print("旦");
		System.out.print("快");
		System.out.println("乐");

	}
}

多个线程并发执行, 访问同一数据时有可能出现线程安全问题, 可以使用同步技术解决.
5.多线程通信
在多线程同步的时候, 可以使用锁对象控制当前线程等待或者唤醒其他等待的线程
使用锁对象.wait()方法可以控制当前线程等待
使用锁对象.notify()方法可以唤醒随机一个在等待的线程
使用锁对象.notifyAll()方法可以唤醒所有在等待的线程
6.JDK5的同步和通信
同步使用ReentrantLock类创建对象, lock()方法开始同步, unlock()方法结束同步
通信使用ReentrantLock类的newCondition()方法可以获取一个Condition对象, 使用该对象的await()和signal()以及signalAll()方法进行通信
对应代码:
package cn.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class Demo11 {

	public static void main(String[] args){
		final pTest p = new pTest();
		new Thread(new Runnable(){
			public void run(){
				for(int j = 0;j<5;j++){
					p.p1();
					
				}
			}
		}).start();
		
		
		new Thread(new Runnable(){
			public void run(){
				for(int j = 0;j<5;j++){
					p.p2();
					
				}
			}
		}).start();
		
	}
}

class pTest{
	private ReentrantLock lo = new ReentrantLock();
	private Condition c = lo.newCondition();
	private Condition c1 = lo.newCondition();
	private int num = 1;
	public void p1(){
		lo.lock();
		if(num != 1){
			try {
				c.await();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		for(int i = 0;i<3;i++){
			System.out.println(i);
			
		}
		System.out.println("------1----");
		num = 2;
		c1.signal();//指定唤醒c1
		lo.unlock();
	}
	
	public void p2(){
		lo.lock();
		if(num != 2){
			try {
				c1.await();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		for(int i = 0;i<5;i++){
			System.out.println(i);
			
		}
		System.out.println("------2----");
		num = 1;
		c.signal();//指定唤醒c2
		lo.unlock();
	}
}



---------------------- android培训java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima
分享到:
评论

相关推荐

    黑马程序员-java多线程技术01

    NULL 博文链接:https://huangminwen.iteye.com/blog/1157983

    多线程高新(黑马程序员)

    NULL 博文链接:https://lvwenwen.iteye.com/blog/1470696

    传智播客.黑马程序员《Java 基础入门》课后习题答案

    1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...

    黑马程序员–Java多线程讲解笔记

    当一个进程中线程有多个时,是多线程。  为什么要用多线程  1,让计算机"同时"做多件事情,节约时间。  2,后台运行程序,提高程序的运行效率.。  3,多线程可以让程序"同时"处理多个事情。  4,...

    黑马程序员_张孝祥_Java多线程与并发库 视频+代码+资料

    黑马程序员_张孝祥_Java多线程与并发库,视频+代码+资料

    黑马程序员_张孝祥_Java多线程与并发库

    黑马程序员_张孝祥_Java多线程与并发库,老师讲的非常仔细,老师很有耐心.欢迎大家下载学习.

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--利用FinalHttp实现多线程断点续传 |--加密之MD5 |--动画Animation详解 |--动画之view左右抖动 |--动画之移动动画 |--动画之组合动画 |--动画之缩放动画ScaleAnimation |--反序列化对象 |--发送短信 读天气 调音量...

    java拼图游戏源码.zip

    这是一个java写的拼图游戏,用了swing、多线程等知识,可以设置行数列、列数、还有使用多线程写的游戏动画,拼图的图块具有磁贴设计,代码封装性较强,容易移植,纯原创。

    图解java多线程设计模式

    日本资-深技术作家、《程序员的数学》作者结城浩执笔,264张图表(UML类图、时序图、Timethreads图等)穿插文中,通过类比手法和浅显的语言,逐一讲解与多线程和并发处理相关的12种设计模式。每章附带练习题和答案,...

    图解java多线程设计模式2017年8月最新版

    精选12种与多线程和并发处理相关的设计模式 264张图表 + 300段Java示例程序 = 轻松学习多线程编程 日本经典多线程入门书,原版长销11年! 本书适合以下读者阅读 a.对多线程感兴趣的人 b.对Java编程感兴趣的人 c.对...

    传智播客_Java培训_毕向东_Java基础[05-多线程]

    传智播客_Java培训_毕向东_Java基础[05-多线程]系黑马程序员_毕向东_Java基础视频教程

    拼图游戏 (源码+所有文件)

    萌新做的一个简单的Java拼图游戏 启动类:pers.sept.jigsaw1.swing下的...多线程。 下拉列表选择数字可以切换关卡图片,最后的“+”,可以添自己的图片到关卡中。 设有背景音乐 有一键通过按钮 等等,块下载去看看吧。

    java并发库高级应用源码--张孝祥

    java并发库thread使用,传统线程技术、定时器技术、线程互斥技术,同步通讯技术、多线程共享数据、并发库应用,线程锁技术,阻塞锁、阻塞队列,线程池等应用

    《Java基础案例教程(第2版)》课后习题答案1

    第1章 Java开发入门一.填空题1. 面向对象,SUN 2. JavaSE,JavaEE,JavaME3.面向对象、跨平台性、支持多线程4. JDK5.bin

    图解java多线程设计模式 2017年8月最新版

    这本书的pdf文件有162M,是最新版高清的pdf,网上原书售价60多元,这里提供的附件是百度云的链接地址。

    学成在线-分布式任务视频处理

    2.适用于黑马程序员Java企业级实战开发《学成在线》微服务项目,基于SpringCloud、SpringCloudAlibaba技术栈开发。 3.采用xxl-job技术。 4.步骤概要: 4.1 作业分片方案 4.2 保证任务不重复执行 4.3 业务流程 5....

    JAVA核心知识点整理.pdf

    给大家分享一篇我在学习java过程中...包含常见的面试题:JVM、Java集合、多线程并发、java基础、SSM框架原理、微服务、Netty和RPC、网络、日志、算法、数据结构、加密、分布式算法、机器学习、大数据等知识点,都是干货

    黑马JVM学习笔记二

    title: 黑马JVM学习笔记二 date: 2020-01-13 1:00:00 ...线程是私有的,多线程之间分别有各自的程序计数器记录对应线程的执行位置 程序计数器是Java虚拟机规范中唯一一个不会存在内存溢出的区(堆和栈等会出现内存溢

    mfc教程(word版)

    4.4.3.2 命令消息的派发和消息的多次处理 67 4.4.3.3 一些消息处理类的OnCmdMsg的实现 69 4.4.3.4 一些消息处理类的OnCommand的实现 71 4.4.4 对控制通知消息的接收和处理 72 4.4.4.1 WM_COMMAND控制通知消息的处理 ...

    java7源码-Java-concurrent:Java并发编程

    黑马程序员——Java异步课程源码 plugin Lombok logback.xml 说明 课堂代码主要在 case_java8 子模块内,按章节划分, io.github.hank.java.concurrent.n2 - 同步与异步 io.github.hank.java.concurrent.n3 - Java...

Global site tag (gtag.js) - Google Analytics