多线程
用户线程 守护线程
多任务就需要多线程
并行的多条路径
线程就是独立的执行路径;
在程序运行时,即使没有自己创建线程,后台也会存在多个线程,如gc线程、主线程;
main()方法称之为主线程,为系统的入口点,用于执行整个程序;
对同一份资源操作时,会存在资源抢夺问题,需要加入并发控制
线程创建
- Thread class 继承hThread类(存在单继承的问题)
- Runnable接口 实现Runnable接口(用的比较多)
- Callable接口 实现Callable接口(juc并发包下的,用的比较少)
创建一个新的执行线程由两种方法,一种是将一个类声明为一个Thread的子类,这个类应该重写run类的方法Thread然后可以分配并启用子类的实例,调用Tread的start方法。
创建线程的另一种方法是声明一个实现Runnable接口的类。然后在类里实现run()方法,Runnable不具有和cpu打交道的start方法,依然要调用Tread的start方法:new Thread(实例化的对象).start()。
继承hThread类创建线程
package com.sxt.thread;
/**
* 创建线程方式一:
* 1、创建:继承Thread+重写run
* 2、启动:创建子类对象+start
*/
public class StartThread extends Thread {
/**
* 线程的入口点
*/
@Override
public void run() {
for (int i = 0; i <20 ; i++) {
System.out.println("一边听歌");
}
}
public static void main(String[] args) {
//创建子类对象
StartThread st = new StartThread();
//调用子类的start方法启动
st.start();//不保证立即运行,cpu调用
//st.run();//普通方法的调用
for (int i = 0; i < 20; i++) {
System.out.println("一边coding");
}
}
}
多线程从URL下载图片
package com.sxt.thread;
public class TDownloader extends Thread {
private String url;//远程路径
private String name;//存储名字
public TDownloader(String name, String url) {
this.url = url;
this.name = name;
}
@Override
public void run() {
WebDownloader wd=new WebDownloader();
wd.download(url,name);
}
public static void main(String[] args) {
TDownloader td1 = new TDownloader("phone.jpg"," http://upload.news.cecb2b.com/2014/0511/1399775432250.jpg");
TDownloader td2 = new TDownloader("spl.jpg","http://p1.pstatp.com/large/403c00037462ae2eee13");
TDownloader td3 = new TDownloader("success.jpg","http://5b0988e595225.cdn.sohucs.com/images/20170830/d8b57e0dce0d4fa29bd5ef014be663d5.jpeg");
//启动三个线程
td1.start();
td2.start();
td3.start();
}
}
/**
package com.sxt.thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 下载图片
*/
public class WebDownloader {
/**
* 下载
* @param url
* @param name
*/
public void download(String url, String name) {
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (MalformedURLException e) {
e.printStackTrace();
System.out.println("不合法的url");
} catch (IOException e) {
e.printStackTrace();
System.out.println("下载失败");
}
}
}
*/