线程学习1-概念、实现方式

1.线程、进程、程序理解
1.程序是指令和数据的合集,本身是静态的。
2.进程是执行程序的一次过程,是系统分配资源的单位
3.线程是CPU执行和调度的单位,一个进程可以包含多个线程。线程之间相互不影响。通常情况下模拟的多线程,是指在一个CPU,同一个时间点仅执行一个代码,因为切换速度很快,所以有一种同时进行的错觉。
总结:
线程就是独立的执行路径,程序执行时即使没有主动开启线程,后台也会启动一线程,例如:主线程、垃圾回收线程等;线程调度由cpu控制,不可人为干预。对同一份资源进行操作时,会存在资源抢夺问题,需要加入并发控制。线程需要消耗资源,比如cpu调度时间,并发控制开销。每个线程都在自己的运行空间中交互,内存控制不当会引起数据不一致。main线程是程序运行的起点,其他线程都是由main线程启动。
2.实现多线程的三个方式
方式一:继承Thread接口,重写run方法,如下:

public class ThreadTest extends Thread {
    private int count;
    @Override
    public void run() {
        while(count<10){
            System.out.println(count++);
        }

    }

    public static void main(String[] args) {
        ThreadTest tt=new ThreadTest();
        tt.start();
    }
}

方式二:继承Runnable接口,实现run方法,由Thread类代理执行,如下:

public class RunnableTest implements Runnable {
    private int count;
    @Override
    public void run() {
        while(count<10){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(count++);

        }
    }

    public static void main(String[] args) {
        RunnableTest rt=new RunnableTest();
        new Thread(rt).start();
        new Thread(rt).start();
    }
}

方式三:继承Callable接口,实现call方法,通过线程池执行,如下:

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;

public class ThreadTest5 implements Callable<Boolean> {
    //线程类
    private  String url;
    private  String name;

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

    @Override
    public Boolean call() throws Exception {
        new DownloadPicture1().downfile(url,name);
        System.out.println("下载了文件"+name);
         return true;
    }

    public static void main(String[] args) {
        String url1="";
        ThreadTest5 ct1=new ThreadTest5("","D:\\"+url1.substring(url1.lastIndexOf("%")+1,url1.length()));
        ExecutorService es= Executors.newFixedThreadPool(3);//创建线程池
        Future<Boolean> rs1= es.submit(ct1);//提交任务并返回结果
        System.out.println(rs1);
   
        es.shutdown();//关闭线程池

    }
}
class DownloadPicture1{
    public void downfile(String url,String name){

        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值