多线程
1.Thread
package Thread;
public class TestTread1 extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 2000; i++) {
System.out.println("我在看代码---"+i);
}
}
public static void main(String[] args) {
TestTread1 testTread1 = new TestTread1();
//testTread1.run(); 不能体现多线程,
testTread1.start(); //这个体现多线程,会和主线程同时执行
for (int i = 0; i < 2000; i++) {
System.out.println("我在学习多线程---"+i);
}
}
}
2.多线程练习 项目中添加一个commons-io-2.6.jar
package Thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
//练习Thread,实现多线程同步下载图片
public class TestThread2 extends Thread{
private String url; //网络图片地址
private String name;//保存的文件名
public TestThread2(String url,String name){
this.url=url;
this.name=name;
}
@Override
public void run(){
WebDownloader webDownloader=new WebDownloader();
webDownloader.downloader(url,name);
System.out.println("下载了文件名为:"+name);
}
public static void main(String[] args) {
TestThread2 t1=new TestThread2("http://www.hyron.com/UpLoadFile/Ad/2014123038951365.jpg","1.jpg");
TestThread2 t2=new TestThread2("http://www.hyron.com/UpLoadFile/Ad/201511749650249.jpg","2.jpg");
TestThread2 t3=new TestThread2("http://www.hyron.com/UpLoadFile/Ad/201511755822169.png","3.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("Io异常,downloader方法出现问题");
}
}
}
3.Runnable
package Thread;
//创建线程方法2,实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start()
public class TestThread3 implements Runnable{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 2000; i++) {
System.out.println("我在看代码---"+i);
}
}
public static void main(String[] args) {
TestThread3 testTread3 = new TestThread3();
//Thead代理
// Thread thread=new Thread(testTread3);
// thread.start();
new Thread(testTread3).start();
for (int i = 0; i < 2000; i++) {
System.out.println("我在学习多线程---"+i);
}
}
}
4.抢票练习
package Thread;
//多个线程同时操作同一个对象
//买火车票
//发现问题:多个线程同时操作同一个资源的情况下,线程不安全,数据紊乱
/**
* 黄牛党-->拿到了第9票
* 小明-->拿到了第10票
* 老师-->拿到了第10票
* 老师-->拿到了第8票
* 小明-->拿到了第7票
* 黄牛党-->拿到了第6票
* 老师-->拿到了第5票
* 小明-->拿到了第4票
* 黄牛党-->拿到了第3票
* 黄牛党-->拿到了第2票
* 小明-->拿到了第1票
* 老师-->拿到了第0票
* 黄牛党-->拿到了第-1票
*/
public class TestThread implements Runnable {
//票
private int ticketNums = 10;
@Override
public void run(){
while (true) {
if (ticketNums <= 0) {
break;
}
try {
Thread.sleep(200);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-->拿到了第" + ticketNums-- + "票");
}
}
public static void main(String[] args) {
TestThread ticket = new TestThread();
new Thread(ticket,"小明").start();
new Thread(ticket,"老师").start();
new Thread(ticket,"黄牛党").start();
}
}
5.龟兔赛跑案例
package Thread;
//模拟龟兔赛跑
public class Race implements Runnable{
//胜利者
private static String winner;
@Override
public void run() {
for (int i=0;i<=100;i++){
//模拟兔子休息
if (Thread.currentThread().getName().equals("兔子")){
try {
Thread.sleep(5);
}catch (Exception e){
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag = gameOver(i);
if (flag){
break;
}
System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");
}
}
//判断是否完成比赛
private boolean gameOver(int steps){
//判断是否有胜利者
if(winner!=null){
return true;
}{
if(steps>=100){
winner = Thread.currentThread().getName();
System.out.println("winner is"+winner);
return true;
}
}
return false;
}
public static void main(String[] args) {
Race race =new Race();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}
6.Callable接口实现多线程
package Thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
public class Test4 implements Callable<Boolean> {
private String url; //网络图片地址
private String name;//保存的文件名
public Test4(String url,String name){
this.url=url;
this.name=name;
}
@Override
public Boolean call(){
WebDownloader webDownloader=new WebDownloader();
webDownloader.downloader(url,name);
System.out.println("下载了文件名为:"+name);
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
Test4 t1=new Test4("http://www.hyron.com/UpLoadFile/Ad/2014123038951365.jpg","1.jpg");
Test4 t2=new Test4("http://www.hyron.com/UpLoadFile/Ad/201511749650249.jpg","2.jpg");
Test4 t3=new Test4("http://www.hyron.com/UpLoadFile/Ad/201511755822169.png","3.jpg");
//创建服务线程池
ExecutorService executorService= Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> submit1= executorService.submit(t1);
Future<Boolean> submit2 = executorService.submit(t2);
Future<Boolean> submit3= executorService.submit(t3);
//获取结果
System.out.println(submit1.get());
System.out.println(submit2.get());
System.out.println(submit3.get());
//关闭提交
executorService.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("Io异常,downloader方法出现问题");
}
}
}
}
7.动态代理
package Thread;
//静态代理模式总结
//真实对象和代理对象都要实现同一个接口,
//代理对象要代理真实角色
//好处
//代理对象可以做很多真实对象做不了的事情
//真实对象专注自己的事情
public class staticProxy {
public static void main(String[] args) {
You you = new You();//你要结婚
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我爱你");
}
}).start();
//这跟多线程的类似
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("我要结婚了,超开心");
}
}
//代理角色,帮助你结婚
class WeddingCompany implements Marry{
//代理谁--》真实目标角色
private Marry target;
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void HappyMarry() {
before();
this.target.HappyMarry(); //真实对象
after();
}
private void before() {
System.out.println("结婚之前,布置现场");
}
private void after() {
System.out.println("收尾款");
}
}
8.Lamda表达式
-
了解Functional Interface是学习lambda表达式的关键
-
函数式接口的定义:
任何接口,如果只包含唯一的一个抽象方法,那么他就是一个函数式接口。
public interface Runnable{
public abstract void run();
}
对于函数式接口,我们可以通过lambda表达式来创建接口对象。
package Thread;
/*
lambda表达式
*/
public class Lambdal {
//3.静态内部类,
static class Like2 implements ILike{
@Override
public void lambda() {
System.out.println("i like lambda2");
}
}
public static void main(String[] args) {
//普通调用
ILike like = new Like();
like.lambda();
like = new Like2();
like.lambda();
//4.局部内部类
class Like3 implements ILike {
@Override
public void lambda() {
System.out.println("i like lambda3");
}
}
like = new Like3();
like.lambda();
//5.匿名内部类,没有类的名称,必须借助接口或者父亲
like = new ILike() {
@Override
public void lambda() {
System.out.println(" i like lambda4");
}
};
like.lambda();
//用lambda简化匿名内部类
like =() ->{
System.out.println(" i like lambda5");
};
like.lambda();
}
}
//1.定义一个函数式接口
interface ILike{
void lambda();
}
//2.实现类
class Like implements ILike{
@Override
public void lambda() {
System.out.println("i like lambda");
}
}
package Thread;
public class Lambda2 {
//2.0静态内部类
// static class Love implements Ilove{
//
// @Override
// public void love(int a) {
// System.out.println("i love you");
// }
// }
public static void main(String[] args) {
//3.0局部内部类
class Love implements Ilove {
@Override
public void love(int a) {
System.out.println("i love you");
}
}
Ilove ilove = new Love();
ilove.love(2);
//4.0匿名类不类
ilove = new Ilove() {
@Override
public void love(int a) {
System.out.println("i love you");
}
};
ilove.love(2);
//5.0lambda表达式
ilove = (int a) -> {
System.out.println("i love you "+a);
};
ilove.love(520);
//5.1lambda参数简化
ilove = (a) -> {
System.out.println("i love you "+a);
};
ilove.love(521);
//5.2lambda括号简化,单个参数可以去掉
ilove = a -> { System.out.println("i love you "+a); };
ilove.love(522);
//5.3lambda花括号简化,代码为单行可以简化
ilove = a -> System.out.println("i love you "+a);
ilove.love(523);
}
}
interface Ilove{
void love(int a);
}
//1.0普通类
// class Love implements Ilove{
//
// @Override
// public void love(int a) {
// System.out.println("i love you");
// }
// }