Java_多线程实现
一个类两个接口
Tread类: 使用时继承Thread类
Runnable接口: 使用时实现Runnable接口
Callable接口: 使用时实现Callable接口
由于类只能单继承, 接口可以多继承, 所以尽量使用接口
Thread的继承(创建线程方式一)
/*
 * 创建线程方式一:
 * 1, 创建: 继承Tread类 + 重写run
 * 2, 启动: 创建子类对象 + start
 *
 */
public class StartThread extends Thread{
	@Override
	public void run() {
		for(int i = 0; i < 20; i++) {
			System.out.println("music");
		}
	}
	public static void main(String[] args) {
		// 创建子类对象
		StartThread st = new StartThread();
		// 启动
		st.start();	// 不保证立即运行cpu调用
		for(int i = 0; i < 20; i++) {
			System.out.println("coding");
		}
	}
}
Runnable的实现(创建线程方式二)
- 创建目标对象
 - 创建线程对象 + 关联目标对象
 - 启动线程
 
/*
 * 创建线程方式二:
 * 1, 创建: 实现Runnable + 重写run
 * 2, 启动: 创建实现类对象 + Thread对象 + start
 *
 * 推荐: 避免单继承的局限性, 优先使用接口
 * 方便共享资源
 */
public class StartRun implements Runnable{
	@Override
	public void run() {
		for(int i = 0; i < 20; i++) {
			System.out.println("music");
		}
	}
	public static void main(String[] args) {
/* 方法一: 声明引用
		// 创建实现类对象
		StartRun sr = new StartRun();
		// 创建代理类对象
		Thread t = new Thread(sr);
		// 启动
		t.start();	// 不保证立即运行cpu调用
*/
//	方法二: 匿名(一个对象只使用一次)
		new Thread(new StartRun()).start();
		for(int i = 0; i < 20; i++) {
			System.out.println("coding");
		}
	}
}
/**********模拟龟兔赛跑示例程序************/
public class Racer implements Runnable {
	private static String winner;	// 共享资源
	@Override
	public void run() {
		for(int steps = 1; steps <= 100; steps++) {
			// 模拟乌龟休息
			if(Thread.currentThread().getName().equals("rabbit") && steps%10 == 0) {
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(Thread.currentThread().getName() + "---->" + steps);
			if(gameOver(steps)) {
				break;
			}
		}
	}
	private boolean gameOver(int steps) {
		if(null != winner ) {	// 分出胜负后, 通过共享变量结束另一个线程
			return true;
		} else {
			if(steps == 100) {
				winner = Thread.currentThread().getName();
				System.out.println("winner---->" + winner);
				return true;
			}
		}
		return false;
	}
	public static void main(String[] args) {
		Racer racer = new Racer();
		new Thread(racer, "tortoise").start();
		new Thread(racer, "rabbit").start();
	}
}
package cn.zyb.thread;
/**
 * 共享资源, 并发
 *
 * @author Administrator
 *
 */
public class Web12306 implements Runnable{
	// 票数
	private int ticketNumbers = 5;
	@Override
	public void run() {
		while(true) {
			if(ticketNumbers < 0) {
				break;
			}
			// 加入睡眠后线程不安全
//			try {
//				Thread.sleep(100);
//			} catch (InterruptedException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
			System.out.println(Thread.currentThread().getName()
					+ "---->" + ticketNumbers--);
		}
	}
	public static void main(String[] args) {
		// 一份资源
		Web12306 web = new Web12306();
		// 多个代理
		new Thread(web, "zyb").start();
		new Thread(web, "zpy").start();
		new Thread(web, "haha").start();
	}
}
/*
zpy---->4
haha---->1
zyb---->2
zpy---->0
*/
Callable的实现(创建线程方式三)
- 创建目标对象
 - 创建执行服务
 - 提交执行
 - 获取结果
 - 关闭服务
 
/****************文件一******************/
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CDownloader implements Callable<Boolean> {
	private String url;
	private String name;
	public CDownloader(String url, String name) {
		this.url = url;
		this.name = name;
	}
	@Override
	public Boolean call() throws Exception{
		WebDownloader wd = new WebDownloader();
		wd.download(url, name);
		System.out.println(name);
		return true;
	}
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		CDownloader cd1 = new CDownloader("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1538910423159&di=9cad47c1aab60ebb7ab6ff71cfe20646&imgtype=0&src=http%3A%2F%2Fa.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F377adab44aed2e73c3dc082b8a01a18b87d6fa84.jpg",
									"1.jpg");
		CDownloader cd2 = new CDownloader("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1538910447240&di=c821bb352f682af7ce07e335f05295c5&imgtype=0&src=http%3A%2F%2Fd.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F203fb80e7bec54e77d03071cb4389b504ec26ac0.jpg",
									"2.jpg");
		CDownloader cd3 = new CDownloader("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1538910459543&di=f99f4f6848913e2edc015cc39bf15f79&imgtype=0&src=http%3A%2F%2Fd.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2Fb64543a98226cffc254c32acb4014a90f603ea4e.jpg",
									"3.jpg");
		// 创建执行服务
		ExecutorService ser = Executors.newFixedThreadPool(3);
		// 提交执行
		Future<Boolean> result1 = ser.submit(cd1);
		Future<Boolean> result2 = ser.submit(cd2);
		Future<Boolean> result3 = ser.submit(cd3);
		// 获取结果
		boolean r1 = result1.get();
		boolean r2 = result1.get();
		boolean r3 = result1.get();
		// 关闭服务
		ser.shutdownNow();
	}
}
/****************文件二******************/
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
// 自定义包
import org.apache.commons.io.FileUtils;
/**
 * 下载
 * @author Administrator
 *
 */
public class WebDownloader {
	public void download(String url, String name) {
		try {
			FileUtils.copyURLToFile(new URL(url), new File (name));
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("不合法URL");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("下载失败");
		}
	}
}
												
											Java_多线程实现的更多相关文章
- JAVA_多线程_单例模式
		
这篇是入职之后的第二篇了,上一篇我简单介绍了一下LOCK里面的类的方法,感兴趣的话可以去了解一下,以后坚持每周至少会更新一篇关于多线程方面的文章,希望博友们可以一起加油成长. 这篇主要的内容是单例模式 ...
 - java_多线程4种实现方式
		
为了34月份回学校春招,不得不复习一下线程的四种实现方式,希望春招时能找到更好的公司,加油! 1.继承Thread类 class MyThread extends Thread{ private in ...
 - 【Java_多线程并发编程】JUC原子类——原子类中的volatile变量和CAS函数
		
JUC中的原子类是依靠volatile变量和Unsafe类中的CAS函数实现的. 1. volatile变量的特性 内存可见性(当一个线程修改volatile变量的值后,另一个线程就可以实时看到此变量 ...
 - 【Java_多线程并发编程】基础篇——synchronized关键字
		
1. synchronized同步锁的原理 当我们调用某对象的synchronized方法或代码块时,就获取了该对象的同步锁.例如,synchronized(obj)就获取了“obj这个对象”的同步锁 ...
 - 【Java_多线程并发编程】基础篇—线程状态及实现多线程的两种方式
		
1.Java多线程的概念 同一时间段内,位于同一处理器上多个已开启但未执行完毕的线程叫做多线程.他们通过轮寻获得CPU处理时间,从而在宏观上构成一种同时在执行的假象,实质上在任意时刻只有一个线程获得C ...
 - Java_多线程2_线程池
		
线程池(pool): 线程池的作用: 1.节省资源,减少线程的数量和创建销毁线程的开销2.合理的管理线程的分配 线程池的创建: 1.newCachedThreadPool //优点:很灵活,弹性的线程 ...
 - Java_多线程
		
线程(Thread) 1.线程是CPU进行资源调度的最小单位 2.线程是进程实际运行的单位,处理进程中无数的小任务 3.线程共享代码和数据空间 4.一个进程可以并发多个线程,线程之间切换系统开销很小 ...
 - 【Java_多线程并发编程】JUC原子类——AtomicLong原子类
		
1. AtomicLong是基本原子类中的一种 AtomicLong是对长整形进行原子操作. 1.1 AtomicLong类的函数列表 // 构造函数 AtomicLong() // 创建值为init ...
 - 【Java_多线程并发编程】JUC原子类——4种原子类
		
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4种,分别是: 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: Atom ...
 - 【Java_多线程并发编程】基础篇——线程状态扭转函数
		
1. wait() sleep() yield() join()用法与区别 本文提到的当前线程是指:当前时刻,获得CPU资源正在执行的线程. 1.1 wait()方法 wait()方法定义在Objec ...
 
随机推荐
- C/C++的二分查找
			
假设有一种温度传感器,已经测得它的电压和温度的对应关系,将电压值以ADC转换后的数字量的值表示,形成温度-AD值的对照表,如下. 大致成一条反比关系的曲线. ADC的底层驱动已经写好,对外有一个接口可 ...
 - MySQL 向表中插入、删除数据
			
一.向表中插入一条信息 1.查看表中的数据 mysql> SELECT * FROM user; +----+---------+----------+ | id | account | pas ...
 - CF149D Coloring Brackets
			
CF149D Coloring Brackets Link 题面: 给出一个配对的括号序列(如"\((())()\)"."\(()\)"等, "\() ...
 - 题解 CF149D
			
题目链接 首先,这是一道区间dp题: 首先我们假设 \(l\) ~ \(r\) 是一段合法的区间: 考虑状态,对于一个区间 \(l\) ~ \(r\) 的方案数,我们需要知道方案数,以及 \(l ,r ...
 - Linux 安装Navicat Premium 15
			
参考:https://gitee.com/andisolo/navicat-keygen 安装 aptitude 管理软件 $ sudo apt-get install aptitude 安装Navi ...
 - 多测师讲解性能测试_面试题_001高级讲师肖sir
			
什么叫做性能测试?1. 软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,所以一般来说性能测试介入的时机是在功能测试完成之后.另外,由定义中的及时性可知性能也是一种指标,可以 ...
 - 【Curl】【转】curl用法!
			
curl基础用法! www.ruanyifeng.com/blog/2019/09/curl-reference.html
 - idea创建servlet工程初体验
			
servlet工程创建 前提:创建项目之前需要配置java环境变量 和tomcat配置,配置完成后进入如下操作. tomcat 安装和配置参考 https://www.cnblogs.com/xush ...
 - lumen-ioc容器测试 (6)
			
lumen-ioc容器测试 (1) lumen-ioc容器测试 (2) lumen-ioc容器测试 (3) lumen-ioc容器测试 (4) lumen-ioc容器测试 (5) lumen-ioc容 ...
 - spring boot:spring security用mysql实现动态权限管理(spring boot 2.3.3)
			
一,动态权限管理的优点和缺点 1,优点: 因为控制权限的数据保存在了mysql或其他存储系统中, 可以动态修改权限控制,无需改动代码和重启应用, 权限变更时灵活方便 2,缺点: 权限的设置需要保存在 ...