自学回顾
多线程实现三种方式:
1.继承Thread父类实现多线程
MyThread类继承Thread在run()方法中编写需要进行多线程处理的业务逻辑
MyThreadDemo类中进行测试:
1…创建MyThread类的实例
2…通过实例进行调用start()方法
面试题:run()方法和start()方法区别:
run()方法只是封装 了需要多线程处理的业务,直接调用run()方法无法实现多线程,调用start()方法实际上做了两个工作,先启动多线程,然后通过jvm(虚拟机)调用run()方法
MyThread类:
public class MyThread extends Thread {
@Override
public void run() {
//System.out.println("好好学习");
for(int x = 0;x<100;x++) {
System.out.println(x);
}
}
}
MyThreadDemo类:
public class MyThreadDemo {
public static void main(String[] args) {
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
mt1.start();
mt2.start();
}
}
2.通过实现Runnable接口实现多线程
通过MyRunnable类实现Runnable接口在其中的run()方法中写入需要多线程处理的业务,通过MyRunnableDemo类测试,首先创建Runnable对象,然后创建Thread对象,并将Runnable对象传入Thread中,通过Thread对象调用start()方法
MyRunnable类:
public class MyRunnalbe implements Runnable {
@Override
public void run() {
for(int x=0;x<100;x++) {
System.out.println(Thread.currentThread().getName()+":"+x);
}
}
}
MyRunnableDemo类
public class MyRunnableDemo {
public static void main(String[] args) {
//C:创建MyRunnable对象
MyRunnalbe mr = new MyRunnalbe();
//Thread(Runnable target, String name) 分配一个新的 Thread对象。
Thread t1 = new Thread(mr,"可乐");
Thread t2 = new Thread(mr,"雪碧");
t1.start();
t2.start();
}
}
可以通过t1.setname()方法给线程命名也可以直接当作参数传入。
3.实现Callable接口实现多线程,此方法依赖线程池
在MyCallable类call()方法中写入需要多线程处理的业务,在MyCallableDemo类中测试,需要在MyCallableDemo类中实现线程池:
ExecutorService pool = Executors.newFixedThreadPool(2);
指定线程池线程数量
通过pool.submit()方法调用启动多线程,最后通过pool.shutdow()方法关闭线程池
MyCallable类:
public class MyCallable implements Callable {
@Override
public Object call() throws Exception {
for(int x=0;x<100;x++) {
System.out.println(Thread.currentThread().getName()+":"+x);
}
return null;
}
}
MyCallableDemo类:
public class CallableDemo {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(2);
pool.submit(new MyCallable());
pool.submit(new MyCallable());
pool.shutdown();
}
}