请说出启动线程的三种方式 ?
你说第一个:new Thread().start(); 第二个: new Thread(Runnable).start() 这没问题 ;那第三个呢,要回答线程池也是用的这两种之一,他这么问有些吹毛求疵的意思,你就可以说通过线程池也可以启动
一个新的线程 3:Executors.newCachedThreadPool()或者FutureTask + Callable
//启动线程的5种方式 public static void main(String[] args) { new MyThread().start(); new Thread(new MyRun()).start(); new Thread(()->{ System.out.println("Hello Lambda!"); }).start(); Thread t = new Thread(new FutureTask<String>(new MyCall())); t.start(); ExecutorService service = Executors.newCachedThreadPool(); service.execute(()->{ System.out.println("Hello ThreadPool"); }); service.shutdown(); }
线程的常用方法:
sleep() :意思就是睡眠,当前线程暂停一段时间让给别的线程去运行。Sleep是怎么复活的?由你的睡眠时间而定,等睡眠到规定的时间自动复活
yield():就是当前线程正在执行的时候停止下来进入等待队列,回到等待队列里在系统的调度算
法里头呢还是依然有可能把你刚回去的这个线程拿回来继续执行,当然,更大的可能性是把原来等待的那些拿
出一个来执行,所以yield的意思是我让出一下CPU,后面你们能不能抢到那我不管.
join();意思就是在自己当前线程加入你调用Join的线程(),本线程等待。等调用的线程运行
完了,自己再去执行。t1和t2两个线程,在t1的某个点上调用了t2.join,它会跑到t2去运行,t1等待t2运
行完毕继续t1运行(自己join自己没有意义)
常见的线程状态有六种:
当我们new一个线程时,还没有调用start()该线程处于新建状态
线程对象调用 start()方法时候,他会被线程调度器来执行,也就是交给操作系统来执行了,那么操作系统来执行的时候,这整个的状态叫Runnable,Runnable内部有两个状态(1)Ready就绪状
态/(2)Running运行状态。就绪状态是说扔到CPU的等待队列里面去排队等待CPU运行,等真正扔到
CPU上去运行的时候才叫Running运行状态。(调用yiled时候会从Running状态跑到Ready状态去,线程配调度器选中执行的时候又从Ready状态跑到Running状态去)
如果你线程顺利的执行完了就会进去(3)Teminated结束状态,(需要注意Teminated完了之后还可不可以回到new状态再调用start?这是不行的,完了这就是结束了)
在Runnable这个状态里头还有其他一些状态的变迁(4)TimedWaiting等待、(5)Waiting等待、
(6)Blocked阻塞,在同步代码块的情况就下没得到锁就会阻塞状态,获得锁的时候是就绪状态运行。在运行的时候如果调用了o.wait()、t.join()、LockSupport.park()进入Waiting状态,调用o.notify()、
o.notifiAll()、LockSupport.unpark()就又回到Running状态。TimedWaiting按照时间等待,等时间结
束自己就回去了,Thread.sleep(time)、o.wait(time)、t.jion(time)、LockSupport.parkNanos()、
LockSupport.parkUntil()这些都是关于时间等待的方法。