java线程实现的三种方式以及静态代理
线程
一个进程中若开辟多个线程,线程的运行由调度器控制,先后顺序不能人为干预。
实现方式
继承 Thread类
调用run方法,只有主线程一条路
调用start方法,主线程和子线程并行交替执行
public class MyThread extends Thread{ @Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("xixi");
}
} public static void main(String[] args) { MyThread myThread = new MyThread();
//myThread.run();只有主线程一条路,先xixi后haha
//开启线程,不一定立刻执行,由cpu调度
myThread.start();//同时运行,xixi、haha交替 //main线程
for (int i = 0; i < 20; i++) {
System.out.println("haha");
}
} }
导入common-io.jar下载图片
import org.apache.commons.io.FileUtils; import java.io.File;
import java.io.IOException;
import java.net.URL; public class MyThread2 extends Thread{ private String url;
private String name; public MyThread2(String url, String name){
this.name = name;
this.url = url;
} @Override
public void run() {
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url, name);
System.out.println("下载了文件名为" + name); } public static void main(String[] args) {
MyThread2 t1 = new MyThread2("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo1.jpg");
MyThread2 t2 = new MyThread2("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo2.jpg");
MyThread2 t3 = new MyThread2("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo3.jpg"); t1.start();
t2.start();
t3.start(); }
} class WebDownloader{
public void downloader(String url, String name){
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("downloader异常");
} finally {
}
}
}
实现Runnable接口
推荐使用,避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
public class MyThread3 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("xixi");
}
} public static void main(String[] args) { //创建实现runnable接口的类对象
MyThread3 myThread3 = new MyThread3();
//创建线程对象,通过线程对象启动线程,代理
new Thread(myThread3).start(); for (int i = 0; i < 20; i++) {
System.out.println("haha");
}
}
}
多线程同时操作一个对象
public class MyThread4 implements Runnable{ private int ticketNums = 10; @Override
public void run() {
while (true){
if(ticketNums <= 0)
break; //模拟延时
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "张票");
}
} public static void main(String[] args) {
MyThread4 myThread4 = new MyThread4();
new Thread(myThread4, "haha").start();
new Thread(myThread4, "xixi").start();
new Thread(myThread4, "hehe").start(); } }
//多个线程操作同一个资源时,线程不安全,数据紊乱
/*
haha拿到了第9张票
xixi拿到了第8张票
hehe拿到了第10张票
hehe拿到了第6张票
xixi拿到了第7张票
haha拿到了第5张票
hehe拿到了第4张票
haha拿到了第4张票
xixi拿到了第4张票
xixi拿到了第2张票
hehe拿到了第3张票
haha拿到了第1张票
*/
实现Callable接口
可以定义返回值、可以抛出异常
import org.apache.commons.io.FileUtils; import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*; public class MyCallable implements Callable<Boolean> { private String url;
private String name; public MyCallable(String url, String name){
this.name = name;
this.url = url;
} @Override
public Boolean call() throws Exception {
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url, name);
System.out.println("下载了文件名为" + name);
return true;
} public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable t1 = new MyCallable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo1.jpg");
MyCallable t2 = new MyCallable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo2.jpg");
MyCallable t3 = new MyCallable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo3.jpg"); //创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3); //提交执行
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
Future<Boolean> r3 = ser.submit(t3); //获取结果
boolean rs1 = r1.get();
boolean rs2 = r2.get();
boolean rs3 = r3.get(); //关闭服务
ser.shutdown();
} } class WebDownloader{
public void downloader(String url, String name){
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("downloader异常");
} finally {
}
}
}
静态代理
真实对象和代理对象都要实现同一个接口
代理对象要代理真实角色
代理对象可以做很多真实对象做不了的事情
真实对象专注做自己的事情
public class StaticProxy {
public static void main(String[] args) { You you = new You(); //代理真实对象runnable
new Thread(()-> System.out.println("haha")).start(); //代理真实对象you
new WeddingCompany(new You()).HappyMarry(); WeddingCompany weddingCompany = new WeddingCompany(you);
weddingCompany.HappyMarry();
}
} interface Marry{
void HappyMarry();
} //真实角色
class You implements Marry{
@Override
public void HappyMarry() {
System.out.println("marry!");
}
} //代理角色
class WeddingCompany implements Marry{ private Marry target; public WeddingCompany(Marry target){
this.target = target;
} @Override
public void HappyMarry() {
before();
this.target.HappyMarry();//真实对象
after();
} public void before() {
System.out.println("before marry");
}
public void after() {
System.out.println("after marry");
}
}
java线程实现的三种方式以及静态代理的更多相关文章
- java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService
前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...
- java核心知识点----创建线程的第三种方式 Callable 和 Future CompletionService
前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...
- 如何实现有返回值的多线程 JAVA多线程实现的三种方式
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable ...
- IOS 多线程,线程同步的三种方式
本文主要是讲述 IOS 多线程,线程同步的三种方式,更多IOS技术知识,请登陆疯狂软件教育官网. 一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IO ...
- java 获取时间戳的三种方式
java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...
- Java 实现线程安全的三种方式
一个程序在运行起来的时候会转换成进程,通常含有多个线程. 通常情况下,一个进程中的比较耗时的操作(如长循环.文件上传下载.网络资源获取等),往往会采用多线程来解决. 比如显示生活中,银行取钱问题.火车 ...
- [OpenSource]浅谈.Net和Java互相调用的三种方式
在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...
- 浅谈.Net和Java互相调用的三种方式
在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...
- java 实现websocket的三种方式
Java中实现websocket常见有以下三种方式: 使用tomcat的websocket实现,需要tomcat 7.x,JEE7的支持. 使用spring的websocket,spring与webs ...
随机推荐
- Shell 信号处理 & Expect 免交互
监控脚本项目 信号处理 1 什么是信号 由键盘组合键或者 kill 命令发出操作称之为信号 信号是发送给进程的,进程在收到信号后会作出默认的响应 2 为何要在进程内处理信号 进程在收到信号后会有默认的 ...
- 部署 WordPress 和 Wecenter
目录 基本环境部署(LNMP) 安装 Nginx 安装 PHP7.1 安装 Mariadb 安装 NFS 部署 NFS 服务端 部署 NFS 客户端 部署 WordPress 首台服务器 环境部署 数 ...
- 数位dp【模板 + 老年康复】
学习博客: 戳这里 戳这里 "在信息学竞赛中,有这样一类问题:求给定区间中,满足给定条件的某个D 进制数或此类数的数量.所求的限定条件往往与数位有关,例如数位之和.指定数码个数.数的大小顺序 ...
- Linux 网络协议栈开发基础篇—— 网桥br0
一.桥接的概念 简单来说,桥接就是把一台机器上的若干个网络接口"连接"起来.其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去.以使得网口之间的报文能够互相转发. 交换机 ...
- 探索 .NET Core 依赖注入的 IServiceCollection
如果您使用了.NET Core,则很可能已使用Microsoft.Extensions.DependencyInjection中的内置依赖项注入容器,在本文中,我想更深入地了解Microsoft De ...
- XSS (跨站脚本攻击) 的原理分析,测试 && 应对措施
1 1 1 XSS (跨站脚本攻击) 的原理分析,测试 1 demo: <!DOCTYPE html> <html lang="en"> <head& ...
- Linux shell create file methods
Linux shell create file methods touch, cat, echo, EOF touch $ touch file.py $ touch file1.txt file2. ...
- JavaScript 如何使用 setTimeout 实现 setInterval
JavaScript 如何使用 setTimeout 实现 setInterval website multi content page setIntervalSimulator "use ...
- Chrome DevTools & Slow 3G Network
Chrome DevTools & Slow 3G Network shortcuts https://developers.google.com/web/tools/chrome-devto ...
- SDK & 埋点 & user behavior tracker
SDK & 埋点 & user behavior tracker 同一个 SDK ,根据不同的应用市场, 分别进行统计分析 ? https://www.umeng.com/ user ...