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异常");
}
}
}