多线程-线程创建(一)
-
程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个惊态的概念。
-
进程(Process):是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位。通常在一个进行可以包含诺干个线程,当然一个进行中至少有一个线程,不然没有存在的意义,线程是CPU调度和执行的单位。
-
线程(Thread):线程就是独立的执行路径
- 在程序运行时,即使自己没有创建线程,后台也会有多个线程,如主线程,gc线程;
- main()称之为主线程,为系统的入口,用于执行整个程序
- 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干涉的
- 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制
- 线程会带来额外的开销,如cpu调度时间,并发控制开销
- 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致。
普通方法的调用和多线程:
-
线程创建的方法一:Threadclass 继承Thread类(重点)
//创建线程方式一:继承Thread类,重写run方法,调用start开启线程 //总结:注意,线程开启不一定立即执行,由CPU调度执行 public class TestThread1 extends Thread{ @Override public void run() { //run方法线程体 for (int i = 0; i < 200; i++) { System.out.println("我在看代码--------"+i); } } public static void main(String[] args) { //main线程,主线程 //创建一个多线程对象 TestThread1 testThread1=new TestThread1(); //调用start()方法开启线程 testThread1.start();//start()是同时执行的 for (int i = 0; i < 1000; i++) { System.out.println("我在学习多线程--"+i); } } }
-
下载图片,联系Thread
-
先去下载commons-io包,把这个jar包导进项目,具体可以参考Apache IO包的下载,我们代码需要用到FileUtils类的copyURLToFile()方法(拷贝一个URL到文件)。
-
找出你要下载图片的地址,以方便我们代码实现。
-
-
具体的代码实现
import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; 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("https://img-blog.csdnimg.cn/20210316213155604.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1bl9pbmRlcGVuZGVudA==,size_16,color_FFFFFF,t_70#pic_center","1.jpg"); TestThread2 t2=new TestThread2("https://img-blog.csdnimg.cn/20210316213209625.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1bl9pbmRlcGVuZGVudA==,size_16,color_FFFFFF,t_70#pic_center","2.jpg"); TestThread2 t3=new TestThread2("https://img-blog.csdnimg.cn/20210316213228816.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1bl9pbmRlcGVuZGVudA==,size_16,color_FFFFFF,t_70#pic_center","3.jpg"); //先下载t1 t1.start(); //然后是t2 t2.start(); //最后是t3 t3.start(); //但是事实不是按顺序的,start()是同时进行的,谁先下载要取决于cpu的安排调度 } } //下载器 class WebDownloader{ //下载方法 public void downloader(String url,String name){ try { //copyURLToFile()拷贝一个URL到文件 FileUtils.copyURLToFile(new URL(url),new File(name)); } catch (IOException e) { e.printStackTrace(); System.out.println("IO异常,downloader方法出现问题"); } } }
-
图片下载成功