进程
- 进程是执行一次程序的过程,动态的概念,是系统资源分配的单位。通常一个进程中包含多个线程,至少包含一个线程如main()主线程。
- main()函数就是主线程,为系统的入口,用于执行整个程序,
线程的创建
- 继承thread类
- 或者实现Runnable接口
- 实现Callable接口
单线程main()运行
public static void main(String[] args) {
//main线程,主线程
for (int i=1;i<=20;i++){
System.out.println("我在学习"+i);
}
}
}
结果很快运行:
多线程运行:我们要实现在主线程中调用子线程,主,子线程同时跑。
- 在main()中实例化多线程对象并调用start()方法,运行main(),发现两个循环是交替进行的。如果调用普通**run()**方法,结果是先执行完一个循环在执行另一个。
import com.sun.org.apache.xerces.internal.dom.PSVIAttrNSImpl;
//创建线程方式:继承Thread类,重写run(),调用start开启线程。
public class TestThread extends Thread{
@Override
public void run() {
//run()方法线程体
for (int i=1;i<=20;i++)
System.out.println("i am studying"+i);
}
public static void main(String[] args) {
TestThread testThread= new TestThread();//创建线程对象
testThread.start();//调用start()开启线程
//main线程,主线程
for (int i=1;i<=20;i++){
System.out.println("我在学习"+i);
}
}
}
`
- **运行结果:**注:每次执行过程不一样。
总结run()方法和多线程执行过程
- 线程开启不一定立即执行,由CPU调度,每次执行结果可能不一样。
利用THread实现多线程同步下载图片
- 首先要将commons-io.jar包导入项目中,新建lib包,commons-io.jar粘贴如包中并右键commons-io.jar包,选则
Add as library,加入到库中、
- 写下载器类,下载方法downloade(),使用写好的类FileUtils,和方法copyURLToFile(),并写入参数URL和name,最终用try catch包起来
public class TestThread2 extends Thread {
//定义属性,用于调用下载方法传参
private String url;//网络图片地址
private String name;//保存的文件名
//构造器,传参数用
public TestThread2(String url,String name){
this.url=url;
this.name=name;
}
//重写run(),下载图片的执行体
public void run(){
WebDownloader webDownloader =new WebDownloader();
webDownloader.downloade(url,name);
System.out.println("下载的文件名为"+name);
}
public static void main(String[] args) {
TestThread2 t1=new TestThread2(给出URL,name);
TestThread2 t2=new TestThread2(同上);
TestThread2 t3=new TestThread2(同上);
t1.start();
t2.start();
t3.start();
}
}
//下载器
class WebDownloader{
//下载方法
public void downloade(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常");
}
}
}
- 注:三张图片下载顺序并不一定按照t1,t2,t3
- 总结:线程创建方式:继承Thread类,重写run()方法,主函数中调用start()方法。