如题所述
Javaå¤çº¿ç¨å®ç°æ¹å¼ä¸»è¦æä¸ç§ï¼ç»§æ¿Threadç±»ãå®ç°Runnableæ¥å£ã使ç¨ExecutorServiceãCallableãFutureå®ç°æè¿åç»æçå¤çº¿ç¨ãå ¶ä¸å两ç§æ¹å¼çº¿ç¨æ§è¡å®åé½æ²¡æè¿åå¼ï¼åªææåä¸ç§æ¯å¸¦è¿åå¼çã
1ã继æ¿Threadç±»å®ç°å¤çº¿ç¨
继æ¿Threadç±»çæ¹æ³å°½ç®¡è¢«æå为ä¸ç§å¤çº¿ç¨å®ç°æ¹å¼ï¼ä½Threadæ¬è´¨ä¸ä¹æ¯å®ç°äºRunnableæ¥å£çä¸ä¸ªå®ä¾ï¼å®ä»£è¡¨ä¸ä¸ªçº¿ç¨çå®ä¾ï¼å¹¶ä¸ï¼å¯å¨çº¿ç¨çå¯ä¸æ¹æ³å°±æ¯éè¿Threadç±»çstart()å®ä¾æ¹æ³ãstart()æ¹æ³æ¯ä¸ä¸ªnativeæ¹æ³ï¼å®å°å¯å¨ä¸ä¸ªæ°çº¿ç¨ï¼å¹¶æ§è¡run()æ¹æ³ãè¿ç§æ¹å¼å®ç°å¤çº¿ç¨å¾ç®åï¼éè¿èªå·±çç±»ç´æ¥extend Threadï¼å¹¶å¤årun()æ¹æ³ï¼å°±å¯ä»¥å¯å¨æ°çº¿ç¨å¹¶æ§è¡èªå·±å®ä¹çrun()æ¹æ³ãä¾å¦ï¼
å¨åéçå°æ¹å¯å¨çº¿ç¨å¦ä¸ï¼
2ãå®ç°Runnableæ¥å£æ¹å¼å®ç°å¤çº¿ç¨
å¦æèªå·±ç类已ç»extendså¦ä¸ä¸ªç±»ï¼å°±æ æ³ç´æ¥extends Threadï¼æ¤æ¶ï¼å¿
é¡»å®ç°ä¸ä¸ªRunnableæ¥å£ï¼å¦ä¸ï¼
为äºå¯å¨MyThreadï¼éè¦é¦å å®ä¾åä¸ä¸ªThreadï¼å¹¶ä¼ å ¥èªå·±çMyThreadå®ä¾ï¼
äºå®ä¸ï¼å½ä¼ å ¥ä¸ä¸ªRunnable targetåæ°ç»Threadåï¼Threadçrun()æ¹æ³å°±ä¼è°ç¨target.run()ï¼åèJDKæºä»£ç ï¼
3ã使ç¨ExecutorServiceãCallableãFutureå®ç°æè¿åç»æçå¤çº¿ç¨
ExecutorServiceãCallableãFutureè¿ä¸ªå¯¹è±¡å®é
ä¸é½æ¯å±äºExecutoræ¡æ¶ä¸çåè½ç±»ãæ³è¦è¯¦ç»äºè§£Executoræ¡æ¶çå¯ä»¥è®¿é®http://www.javaeye.com/topic/366591 ï¼è¿éé¢å¯¹è¯¥æ¡æ¶åäºå¾è¯¦ç»ç解éãè¿åç»æç线ç¨æ¯å¨JDK1.5ä¸å¼å
¥çæ°ç¹å¾ï¼ç¡®å®å¾å®ç¨ï¼æäºè¿ç§ç¹å¾æå°±ä¸éè¦å为äºå¾å°è¿åå¼è大费å¨æäºï¼èä¸å³ä¾¿å®ç°äºä¹å¯è½æ¼æ´ç¾åºã
å¯è¿åå¼çä»»å¡å¿
é¡»å®ç°Callableæ¥å£ï¼ç±»ä¼¼çï¼æ è¿åå¼çä»»å¡å¿
é¡»Runnableæ¥å£ãæ§è¡Callableä»»å¡åï¼å¯ä»¥è·åä¸ä¸ªFutureç对象ï¼å¨è¯¥å¯¹è±¡ä¸è°ç¨getå°±å¯ä»¥è·åå°Callableä»»å¡è¿åçObjectäºï¼åç»å线ç¨æ± æ¥å£ExecutorServiceå°±å¯ä»¥å®ç°ä¼ 说ä¸æè¿åç»æçå¤çº¿ç¨äºãä¸é¢æä¾äºä¸ä¸ªå®æ´çæè¿åç»æçå¤çº¿ç¨æµè¯ä¾åï¼å¨JDK1.5ä¸éªè¯è¿æ²¡é®é¢å¯ä»¥ç´æ¥ä½¿ç¨ã代ç å¦ä¸ï¼
代ç 说æï¼
ä¸è¿°ä»£ç ä¸Executorsç±»ï¼æä¾äºä¸ç³»åå·¥åæ¹æ³ç¨äºåå
线ç¨æ± ï¼è¿åç线ç¨æ± é½å®ç°äºExecutorServiceæ¥å£ã
public static ExecutorService newFixedThreadPool(int nThreads)
å建åºå®æ°ç®çº¿ç¨ç线ç¨æ± ã
public static ExecutorService newCachedThreadPool()
å建ä¸ä¸ªå¯ç¼åç线ç¨æ± ï¼è°ç¨execute å°éç¨ä»¥åæé ç线ç¨ï¼å¦æ线ç¨å¯ç¨ï¼ãå¦æç°æ线ç¨æ²¡æå¯ç¨çï¼åå建ä¸ä¸ªæ°çº¿ç¨å¹¶æ·»å å°æ± ä¸ãç»æ¢å¹¶ä»ç¼åä¸ç§»é¤é£äºå·²æ 60 ç§éæªè¢«ä½¿ç¨ç线ç¨ã
public static ExecutorService newSingleThreadExecutor()
å建ä¸ä¸ªå线ç¨åçExecutorã
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
å建ä¸ä¸ªæ¯æå®æ¶åå¨ææ§çä»»å¡æ§è¡ç线ç¨æ± ï¼å¤æ°æ
åµä¸å¯ç¨æ¥æ¿ä»£Timerç±»ã
æ»ç»ï¼ExecutoreServiceæä¾äºsubmit()æ¹æ³ï¼ä¼ éä¸ä¸ªCallableï¼æRunnableï¼è¿åFutureãå¦æExecutoråå°çº¿ç¨æ± è¿æ²¡æå®æCallableç计ç®ï¼è¿è°ç¨è¿åFuture对象çget()æ¹æ³ï¼ä¼é»å¡ç´å°è®¡ç®å®æã
我们现在所使用操作系统都是多任务操作系统(早期使用的DOS操作系统为单任务操作系统),多任务操作指在同一时刻可以同时做多件事(可以同时执行多个程序)。
多进程:每个程序都是一个进程,在操作系统中可以同时执行多个程序,多进程的目的是为了有效的使用CPU资源,每开一个进程系统要为该进程分配相关的系统资源(内存资源)
多线程:线程是进程内部比进程更小的执行单元(执行流|程序片段),每个线程完成一个任务,每个进程内部包含了多个线程每个线程做自己的事情,在进程中的所有线程共享该进程的资源;
主线程:在进程中至少存在一个主线程,其他子线程都由主线程开启,主线程不一定在其他线程结束后结束,有可能在其他线程结束前结束。Java中的主线程是main线程,是Java的main函数;
1. 线程的实现可以通过继承Thread类和实现Runable接口 也可以使用线程池。callable配合future可以实现线程中的数据获取。
2. Java中的线程有7种状态,new runable running blocked waiting timewaiting terminate
blocked是线程等待其他线程锁释放。 waiting是wait以后线程无限等待其他线程使用notify唤醒 timewating是有限时间地等待被唤醒,也可能是sleep固定时间。
3. Thread的join是实例方法,比如a.join(b),则说明a线程要等b线程运行完才会运行。
4. o.wait方法会让持有该对象o的线程释放锁并且进入阻塞状态,notify则是持有o锁对象的线程通知其他等待锁的线程获取锁。notify方法并不会释放锁。注意这两个方法都只能在synchronized同步方法或同步块里使用。
5. synchronized方法底层使用系统调用的mutex锁,开销较大,jvm会为每个锁对象维护一个等待队列,让等待该对象锁的线程在这个队列中等待。当线程获取不到锁时则让线程阻塞,而其他检查notify以后则会通知任意一个线程,所以这个锁时非公平锁。
6. Thread.sleep(),Thread.interrupt()等方法都是类方法,表示当前调用该方法的线程的操作。
一个线程实例连续start两次会抛异常,这是因为线程start后会设置标识,如果再次start则判断为错误。
2. Java中的线程有7种状态,new runable running blocked waiting timewaiting terminate
blocked是线程等待其他线程锁释放。 waiting是wait以后线程无限等待其他线程使用notify唤醒 timewating是有限时间地等待被唤醒,也可能是sleep固定时间。
3. Thread的join是实例方法,比如a.join(b),则说明a线程要等b线程运行完才会运行。
4. o.wait方法会让持有该对象o的线程释放锁并且进入阻塞状态,notify则是持有o锁对象的线程通知其他等待锁的线程获取锁。notify方法并不会释放锁。注意这两个方法都只能在synchronized同步方法或同步块里使用。
5. synchronized方法底层使用系统调用的mutex锁,开销较大,jvm会为每个锁对象维护一个等待队列,让等待该对象锁的线程在这个队列中等待。当线程获取不到锁时则让线程阻塞,而其他检查notify以后则会通知任意一个线程,所以这个锁时非公平锁。
6. Thread.sleep(),Thread.interrupt()等方法都是类方法,表示当前调用该方法的线程的操作。
一个线程实例连续start两次会抛异常,这是因为线程start后会设置标识,如果再次start则判断为错误。如果感兴趣可以B站搜索高淇老师的视频看看,希望对您有所帮助。本回答被网友采纳