JAVA多线程-线程

创建线程
要了解多线程,肯定要先知道如何创建线程,创建线程的方式有三种,继承 Thread 类、实现 Runnable 接口、实现 Callable 接口。

//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
public class TestThread1 extends Thread {
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在学习 "+i);
}
}

public static void main(String[] args) {
    //main线程,主线程

    //创建一个线程对象
    TestThread1 testThread1 = new TestThread1();
    //调用start()方法开启方法
    testThread1.start();

    for (int i = 0; i < 20; i++) {
        System.out.println("我在学习多线程 "+i);
    }
}

}
//创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法
public class TestThread3 implements Runnable{
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(“我在看代码”);
}
}

public static void main(String[] args) {

    //创建runnable接口的实现类对象
    TestThread3 testThread3 = new TestThread3();
    //创建线程对象,通过线程对象来开启我们的线程,代理
    Thread thread = new Thread(testThread3);

    thread.start();

    for (int i = 0; i < 20; i++) {
        System.out.println("我在学习多线程");
    }
}

}
第三种通过一个下载的 jar 包来演示,先导入依赖

commons-io commons-io 2.7 //线程创建方式三;实现Callable接口 //先导入一个依赖 /* callable的好处 可以定义返回值 可以抛出异常 */ public class TestCallable implements Callable {
private String url;
private String name;

public TestCallable(String url, String name) {
    this.url = url;
    this.name = name;
}

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 {
    TestCallable t1 = new TestCallable("图片地址", "1.jpg");
    TestCallable t2 = new TestCallable("图片地址", "2.jpg");
    TestCallable t3 = new TestCallable("图片地址", "3.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.shutdownNow();
}

}

//下载器
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("I0异常, downloader方法出现问题");
    }
}

}
Copy
线程不安全
死锁条件

互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

————————————————
原文作者:HuDu
转自链接:https://learnku.com/articles/46533
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值