java 多线程
9.多线程
9.1 多线程介绍:进程,线程,cpu,main
9.2 Thread 创建的3种方式:
继承Thread
实现Runnable接口
实现Callable接口
public static void main(String[] args) {
thread01 t01=new thread01();
t01.start(); //调用start()启动线程
for (int i = 0; i <200 ; i++) {
System.out.println("222222");
}
}
9.3 网图下载
commons-io-2.0
public class thread02 extends Thread{
private String url;
private String name;
public thread02(String url,String name){
this.url=url;
this.name=name;
}
@Override
public void run(){
WebDownloader wb=new WebDownloader();
try {
wb.downloader(url,name);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
thread02 t1=new thread02("https://pics2.baidu.com/feed/e1fe9925bc315c60cc0fff0c66bcdc1d48547753.jpeg","name1");
thread02 t2=new thread02("https://pics2.baidu.com/feed/e1fe9925bc315c60cc0fff0c66bcdc1d48547753.jpeg","name2");
thread02 t3=new thread02("https://pics2.baidu.com/feed/e1fe9925bc315c60cc0fff0c66bcdc1d48547753.jpeg","name3");
t1.start();
t2.start();
t3.start();
}
}
class WebDownloader{
public void downloader(String url,String name) throws IOException {
FileUtils.copyURLToFile(new URL(url),new File(name));
System.out.println("下载:"+name);
}
}
9.4 实现Runnable接口
public class thread03 implements Runnable {
@Override
public void run() {
for (int i = 0; i <100 ; i++) {
System.out.println("111");
}
}
public static void main(String[] args) {
thread03 t3=new thread03();
Thread td1=new Thread(t3);
Thread td2=new Thread(t3);
td1.setName("线程1");
td2.setName("线程2");
td1.start();
td2.start();
}
}
9.5并发问题
9.6 龟兔赛跑
9.7 实现Callable接口
优点:可以有返回值,可以抛出异常
public class thread04 implements Callable
@Override
public Integer call() throws Exception {
return 1;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
/*多线程的第三种实现方式:
特点:可以获取到多线程运行的结果
*/
//创建MyCallable的对象(表示多线程要执行的任务)
thread04 mc = new thread04();
//创建FutureTask的对象(作用管理多线程运行的结果)
FutureTask<Integer> fu = new FutureTask<>(mc);
FutureTask<Integer> fu1 = new FutureTask<>(mc);
//创建线程的对象
Thread t1 = new Thread(fu);
Thread t2 = new Thread(fu1);
t1.setName("线程1");
t2.setName("线程2");
//启动线程
t1.start();
t2.start();
//获取多线程运行的结果
Integer result1 = fu.get();
Integer result2 = fu1.get();
System.out.println(result1 + " : " + result2);
}
三种实现方式的优缺点
1.继承Thread类 编程比较简单,可以直接使用Thread类中的方法;可以扩展性较差,不能再继承其他的类
2.实现Runnable/Callable接口 扩展性强,实现该接口的同时还可以继承其他的类;编程相对复杂,不能直接使用Thread类中的方法
9.8.多线程常用 方法名称
String getName()返回此线程的名称
int getId()返回此线程的ID
void setName(String name)设置线程的名字(构造方法也可以设置名字)
static Thread currentThread( )获取当前线程的对象
static void sleep(long time)让线程休眠指定的时间,单位为毫秒
setPriority(int newPriority)设置线程的优先级
final int getPriority( )获取线程的优先级
final void setDaemon(boolean on)设置为守护线程
public static void yield( )出让线程/礼让线程
public static void join( )插入线程/插队线程