多线程处理
process 与 Thread
创建线程的三种方式
继承Threadl类
package com.qiyu;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
/**
* @program: jvm_test
* @description:
* @author: cxy
* @create: 2022-03-14 14:54
**/
public class ThreadUploadImg extends Thread{
private String url;
private String name;
public ThreadUploadImg(String url,String name){
this.url = url;
this.name = name;
}
public static void main(String[] atgs)
{
ThreadUploadImg t1 = new ThreadUploadImg("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F4k%2Fs%2F02%2F2109242332225H9-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1649833481&t=e22b68a832a2ba1366c6b8a2d18a1d1b","图片1.jpg");
ThreadUploadImg t2 = new ThreadUploadImg("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F4k%2Fs%2F02%2F2109242332225H9-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1649833481&t=e22b68a832a2ba1366c6b8a2d18a1d1b","图片2.jpg");
ThreadUploadImg t3 = new ThreadUploadImg("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F4k%2Fs%2F02%2F2109242332225H9-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1649833481&t=e22b68a832a2ba1366c6b8a2d18a1d1b","图片3.jpg");
ThreadUploadImg t4 = new ThreadUploadImg("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F4k%2Fs%2F02%2F2109242332225H9-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1649833481&t=e22b68a832a2ba1366c6b8a2d18a1d1b","图片4.jpg");
t1.start();
t2.start();
t3.start();
t4.start();
}
@Override
public void run() {
WebDownload webDownload = new WebDownload();
webDownload.downloader(url,name);
System.out.println("下载文件:"+name);
}
}
class WebDownload{
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
}
}
}
实现Runable接口
package com.qiyu;
/**
* @program: jvm_test
* @description:
* @author: cxy
* @create: 2022-03-14 15:09
**/
public class ThreadInterface implements Runnable{
@Override
public void run() {
for(int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
public static void main(String[] agrs){
ThreadInterface threadInterface =new ThreadInterface();
Thread thread = new Thread(threadInterface);
Thread thread2 = new Thread(threadInterface);
//开启线
thread.setName("这是一条新的线程~~");
thread2.setName("这是第二条新的线程~~");
thread.start();
thread2.start();
}
}
实现Callable接口
package com.qiyu;
import java.util.concurrent.*;
/**
* @program: jvm_test
* @description:
* @author: cxy
* @create: 2022-03-15 14:36
**/
public class ThreadCallable implements Callable<Boolean>{
@Override
public Boolean call() throws Exception {
for(int i =0;i<10;i++){
System.out.println(i);
}
return true;
}
public static void main(String[] args){
ThreadCallable threadCall = new ThreadCallable();
//创建执行服务
ExecutorService executorService = Executors.newFixedThreadPool(1);
Future<Boolean> f1 = executorService.submit(threadCall);
try {
boolean rs1 = f1.get();
//关闭服务
executorService.shutdownNow();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
线程案例 龟兔赛跑
package com.qiyu;
import com.sun.org.apache.xpath.internal.operations.Bool;
/**
* @program: jvm_test
* @description:
* @author: cxy
* @create: 2022-03-14 16:11
**/
public class GuiTU implements Runnable{
private static String winner;
@Override
public void run() {
for(int i=0;i<=200;i++){
if(Thread.currentThread().getName().equals("兔子") && i == 100) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Boolean flag = gameOver(i);
if(flag) break;
System.out.println(Thread.currentThread().getName()+"跑了"+i+"米");
}
}
public static void main(String[] args) {
GuiTU guiTU = new GuiTU();
new Thread(guiTU,"乌龟").start();
new Thread(guiTU,"兔子").start();
}
public static Boolean gameOver(int withNumber) {
if( winner!=null){
return true;
}
if(withNumber==200){
winner = Thread.currentThread().getName();
System.out.println(winner+"获得冠军!!");
return true;
}
return false;
}
}
静态代理
Lambda表达式
/*
*函数式接口定义
* 如果包含唯一个抽象方法 那么他就是一个函数接口
*/
package com.qiyu.lambda;
/**
* @program: jvm_test
* @description:
* @author: cxy
* @create: 2022-03-15 15:44
**/
/**
*
* 函数式接口定义
* 如果包含唯一个抽象方法 那么他就是一个函数接口
*
*/
public class TestLambdda1
{
public static void main(String[] args) {
//外部类实现方法
ILike like = new Like();
like.lambda();
//静态内部类实现方法
like = new Like2();
like.lambda();
//局部内部类实现方法
class Like3 implements ILike{
@Override
public void lambda() {
System.out.println("我喜欢lamdba - 3");
}
}
like = new Like3();
like.lambda();
//匿名内部类
like = new ILike() {
@Override
public void lambda() {
System.out.println("我喜欢lambda - 4");
}
};
like.lambda();
like = ()->System.out.println("我喜欢lambda - 5");
like.lambda();
}
//静态内部类
static class Like2 implements ILike{
@Override
public void lambda() {
System.out.println("我喜欢lamdba - 2");
}
}
}
interface ILike{
void lambda();
}
class Like implements ILike{
@Override
public void lambda() {
System.out.println("我喜欢lamdba - 1");
}
}
总结
函数式接口定义
-
如果包含唯一个抽象方法 那么他就是一个函数接口
-
Lambda 表达式只能有一行代码的情况下 才能见减化成一行 如果有多行 那么就用代码包裹
-
前提是接口为函数式接口
-
可以简化参数类型
线程的五大状态
创建状态
就绪状态
阻塞状态
运行状态
死亡状态