一、创建线程的方式:4种
(start作用:①启动当前线程,②调用run()方法)、
class MyThread extends Thread{ public void run() {} } MyTread myThread = new MyThread(); myThread.start();
2、类实现Runnable接口,重写run()方法。
1 class MyThread implements Runnable{ 2 public void run() {} 3 } 4 5 MyThread myThread = new MyThread(); 6 new Thread(myThread).start();
3、实现Callable接口
class CallThread implements Callable{ @Override public Object call() throws Exception { return null } } CallThread callThread = new CallThread(); FutureTask futureTask = new FutureTask(callThread); new Thread(futureTask).start();
4、创建线程池
class NumberThread implements Runnable{ @Override public void run() {} } ExecutorService service = newFixedThreadPool(10); ThreadPoolExecutor service1 = (ThreadPoolExecutor) service; service1.setCorePoolSize(10); service1.setMaximumPoolSize(10); service.execute(new NumberThread()); service.shutdown();
二、线程的生命周期:创建、就绪、运行、阻塞、死亡
三、解决线程安全方式:3种,同步方法、同步代码块、ReentrantLock
同步代码块:synchronized
synchronized和lock的异同:
相同:都能解决线程安全问题
不同:synchronized机制在执行完相应的同步代码后,自动释放同步监视器;lock需要手动的启动同步,手动结束同步。
优先使用顺序:
lock→同步代码块→同步方法
四、线程通讯涉及到的三个方法:wait(),notify(),notifyall()
wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。
notify():一旦执行此方法,就会唤醒被wait的一个线程,如果多个线程被wait,就唤醒优先级高的线程。
notify():一旦执行此方法,就会唤醒所有被wait的线程。
wait()、notify()、notifyall()调用者必须是同步代码块或同步方法中的同步监视器。
wait()和slee的异同?
1、相同点:一点执行方法,都可以使得当前的线程进入阻塞状态
2、不同点:①两个方法声明的位置不同:Thread类中声明sleep(),Object类中声明wait();
②调用的要求不同:sleep()可以在任何需要的场景下调用。wait()必须使用在同步代码块或同步方法中。
③关于是否释放同步监视器:如果两个方法都在同步代码块或给同步方法中,sleep()不会释放锁,wait()会释放锁。