多线程有三种实现方法。推荐优先使用接口,避免单继承的局限性,同时也方便共享资源。
run方法不能抛出异常!!
创建线程方式一:
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();
//启动
st.start();//不保证立即运行 cpu调用
//st.run();//普通方法的调用
for(int i = 0;i < 20;i++) {
System.out.println("一边coding");
}
}
}
创建线程方式二:
1、创建:实现Thread + 重写run
2、启动:创建实现类对象 + Thread对象 + start
public class StartRun implements Runnable {
/**
* 线程的入口点
*/
@Override
public void run() {
for(int i = 0;i < 20;i++) {
System.out.println("一边听歌");
}
}
public static void main(String[] args) {
/* //创建实现类对象
StartRun sr = new StartRun();
//创建代理类对象
Thread t = new Thread(sr);
//启动
t.start();//不保证立即运行 cpu调用
*/
new Thread(new StartRun()).start();;
//st.run();//普通方法的调用
for(int i = 0;i < 20;i++) {
System.out.println("一边coding");
}
}
}
了解创建线程的方式三:
实现callable接口+重写call方法
public class CDownloader implements Callable<Boolean> {
private String url;//远程路径
private String name;//存储名字
public CDownloader(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public Boolean call() throws Exception {
WebDownloader wd = new WebDownloader();
wd.downLoad(url, name);
System.out.println(name);
return true;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
CDownloader cd1 = new CDownloader("http://tiebapic.baidu.com/forum/w%3D580%3B/sign=e23e1f4d80dda144da096cba828cd2a2/ae51f3deb48f8c547a077e712d292df5e1fe7f9c.jpg", "boy.jpg");
CDownloader cd2 = new CDownloader("http://tiebapic.baidu.com/forum/w%3D580%3B/sign=222efae1b7ec08fa260013af69d53c6d/359b033b5bb5c9e ac0e35dbdc239b6003af3b358.jpg", "girl.jpg");
CDownloader cd3 = new CDownloader("http://tiebapic.baidu.com/forum/w%3D580%3B/sign=a2bf77641bd79123e0e0947c9d0f5882/9c16fdfaaf51f3dedcb09e0883eef01f3a29795f.jpg", "butterfly.jpg");
//创建执行服务:
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行:
Future<Boolean> result1 = ser.submit(cd1);
Future<Boolean> result2 = ser.submit(cd2);
Future<Boolean> result3 = ser.submit(cd3);
//获取结果:
boolean r1 = result1.get();
boolean r2 = result1.get();
boolean r3 = result1.get();
System.out.println(r3);
//关闭服务:
ser.shutdownNow();
}
}