一ã€çº¿½E‹çš„基本概念
½Ž€å•çš„è¯ß_¼š¾U¿ç¨‹ž®±æ˜¯ä¸€ä¸ªç¨‹åºé‡Œä¸åŒçš„æ‰§è¡Œèµ\å¾?br />
在åŒä¸€ä¸ªæ—¶é—´ç‚¹ä¸Šcpuåªä¼šæœ‰ä¸€ä¸ªçº¿½E‹åœ¨æ‰§è¡Œ
Java里的多线½E‹æ˜¯é€šè¿‡java.lang.Thread¾cÀL¥å®žçްçš?br />
æ¯ä¸ª¾U¿ç¨‹éƒ½æ‹¥æœ‰è‡ªå·Þq‹¬ç«‹çš„æ–ÒŽ³•æ ˆç©ºé—?/p>
二ã€java¾U¿ç¨‹çš„创建和å¯åЍ
½W¬ä¸€¿U?br />
定义¾U¿ç¨‹¾cÕd®žçްRunnable接å£
Thread myThread = new Thread(target) //target为Runnable接壾cÕdž‹
Runnableä¸åªæœ‰ä¸€ä¸ªæ–¹æ³•:
public void run();用以定义¾U¿ç¨‹˜q行ä½?br />
½W¬äºŒ¿U?br />
å¯ä»¥å®šä¹‰ä¸€ä¸ªThreadçš„å¾cÕdƈé‡å†™å…¶runæ–ÒŽ³•åQ?br />
clas MyThread extends Thread{
public void run(){}
}
¾U¿ç¨‹¾cÕd¿…™å»é€šè¿‡æ‰§è¡ŒThreadçš„start()æ–ÒŽ³•å¯åŠ¨ä¸€ä¸ªæ–°çš„çº¿½E?br />
如果调用run()æ–ÒŽ³•是属于方法的调用åQŒä¸ä¼šå¯åŠ¨ä¸€ä¸ªæ–°çš„çº¿½E?br />
推è使用½W¬ä¸€¿Uæ–¹å¼åˆ›å»ºçº¿½E‹ï¼Œä½¿ç”¨æŽ¥å£è¾ƒäØ“ç‰|´»
二ã€çº¿½E‹çжæ€è£…æ?/span>
调用¾U¿ç¨‹start()æ–ÒŽ³•æ—Óž¼Œ¾U¿ç¨‹˜q›å…¥ž®ÞqÈA状æ€ï¼ŒCpuåˆ†é…æ—‰™—´ç‰‡ï¼Œ¾U¿ç¨‹˜q›å…¥˜q行状æ€?br />
æ—‰™—´ç‰‡ç»“æŸï¼Œrun()æ–ÒŽ³•未执行完åQŒçº¿½E‹è¿›å…¥é˜»å¡žçжæ€ã€?/p>
三ã€çº¿½E‹æŽ§åˆ¶åŸºæœ¬æ–¹æ³?/span>
isAlive() //判斾U¿ç¨‹æ˜¯å¦˜q?#8220;‹zÈ€”åQŒå³¾U¿ç¨‹æ˜¯å¦˜q˜æœª¾lˆæ¢
getPriority() //获得¾U¿ç¨‹çš„优先çñ”æ•°å€?br />
setPriority() //讄¡½®¾U¿ç¨‹çš„优先çñ”指数
Thread.sleep() //陿€æ–¹æ³•,ž®†å½“å‰çº¿½E‹ç¡çœ 指定毫¿U’æ•°
join() //调用æŸçº¿½E‹çš„该方法,ž®†å½“å‰çº¿½E‹ä¸Žè¯¥çº¿½E‹åˆòqÓž¼Œ
//å³ç‰å¾…该¾U¿ç¨‹¾l“æŸåQŒå†å›žå¤å½“剾U¿ç¨‹çš„è¿è¡Œã€?br />
yield() //让出CPUåQŒå½“å‰çº¿½E‹è¿›å…¥å°±¾lªçжæ€ç‰å¾…è°ƒåº?br />
interrupt() //䏿–¾U¿ç¨‹
wait() //当剾U¿ç¨‹˜q›å…¥å¯¹è±¡çš„wait pool
notify()/all //唤醒对象的wait poolä¸çš„一ä¸?所有ç‰å¾…线½E?/p>
å››ã€sleepæ–ÒŽ³•
Threadçš„é™æ€æ–¹æ³?br />
public static void sleep(long millis)throws InterruptedException
å¿…é¡»å¯¹å¼‚å¸¸è¿›è¡Œæ•æ?br />
Thread.currentThread(); //拿到当剾U¿ç¨‹
五ã€interruptæ–ÒŽ³•一¿U让¾U¿ç¨‹é€€å‡ºçš„æ–¹å¼ã€?
å…ã€joinå’Œyieldæ–ÒŽ³•
t.join(); //tçš„run()æ–ÒŽ³•完æ‰ä¼šç‘ô¾l执行当å‰çº¿½E‹æ–¹æ³•体
//也就是两个线½E‹å˜æˆäº†ä¸€ä¸ªçº¿½E?br />
t.yield(); //æš‚åœå½“剿£åœ¨æ‰§è¡Œçš„线½E‹å¯¹è±¡ï¼Œòq¶æ‰§è¡Œå…¶ä»–线½E‹ã€‚æ–¹æ³•äØ“é™æ€?br />
//哪个¾U¿ç¨‹ä½“æ‰§è¡Œæ¤æ–ÒŽ³•åQŒå“ªä¸ªçº¿½E‹è®©æ?br />
七ã€çº¿½E‹ä¼˜å…ˆçñ”åˆ?nbsp;
¾U¿ç¨‹çš„优先çñ”用数å—表½Cºï¼ŒèŒƒå›´ä»?åˆ?0åQŒä¸€ä¸ªçº¿½E‹çš„¾~ºçœä¼˜å…ˆ¾U§äØ“5.
Thread.MAX_PRIORITY=1
Thread.MIN_PRIORITY=10
Thread.NORM_PRIORITY=5
例:t.setPriority(Thread.NORM_PRIORITY+3);
★八ã€çº¿½E‹åŒæ?/span>
1.åŒæ¥ä»£ç å?br />
synchronized(this){ //在执行代ç å—˜q‡ç¨‹ä¸ï¼Œä¸ä¼šè¢«å…¶ä»–线½E‹æ‰“æ–?br />
...
}
public sunchronized void method //æ‰§è¡Œæ¤æ–¹æ³•æ—¶åQŒå½“å‰å¯¹è±¡è¢«é”定
在Javaè¯è¨€ä¸ï¼Œå¼•入了对象互斥é”的概念,ä¿è¯å…׃ínæ•°æ®æ“作的完整性,æ¯ä¸ªå¯¹è±¡ 都对应一个寿UîCØ“"互斥é”?çš„æ ‡è®ŽÍ¼Œ˜q™ä¸ªæ ‡è®°ä¿è¯åœ¨ä“Q一时刻åQŒåªèƒ½æœ‰ä¸€ä¸ªçº¿½E‹è®¿ 问该对象ã€?br />
2.¾U¿ç¨‹æ»é”
ä¹ã€ç”Ÿäº§è€…消费者问é¢?br />
å››ã€OutputStream的基本方æ³?/span>
void write(int b) throws IOException å‘输出æµå†™å…¥ä¸€ä¸ªå—节数 æ?br />
void flush() throws IOException ž®†è¾“出æµä¸ç¼“冲的数æ®å…¨éƒ¨å†™å‡ºåˆ°ç›®çš„地
五ã€Writer的基本方æ³?/span>
void write(int c) throws IOException å‘输出æµå†™å…¥ä¸€ä¸ªå—½W¦æ•°æ?br />
void write(String str) throws IOException
ž®†ä¸€ä¸ªå—½W¦ä¸²ä¸çš„å—符写入到输出æµ
void write(String str,int offset,int length)
ž®†ä¸€ä¸ªå—½W¦ä¸²ä»Žoffset开始的length个嗽W¦å†™å…¥åˆ°è¾“出‹¹?br />
void flush() throws IOException ž®†è¾“出æµä¸ç¼“冲的数æ®å…¨éƒ¨å†™å‡ºåˆ°ç›®çš„地
å…ã€Reader的基本方æ³?/span>
int read() throws IOException è¯Õd–一个嗽W¦ä»¥æ•´æ•°å½¢å¼˜q”回åQŒå¦‚果返å›?1已到输入‹¹çš„æœ«å°¾
七ã€èŠ‚ç‚ÒŽµ¾cÕdž‹
å…«ã€è®¿é—®æ–‡ä»¶ä¹‹FileInputStreamå’ŒFileOutputStream¾l§æ‰¿åŸºç±»ç”¨äºŽå‘文件ä¸è¾“入输出å—节
ä¹ã€è®¿é—®æ–‡ä»¶ä¹‹FileReaderå’ŒFileWriter¾l§æ‰¿åŸºç±»ç”¨äºŽå‘文件ä¸è¾“入输出å—符
----输出‹¹åœ¨æž„é€ å‡½æ•°ç¬¬äºŒä¸ªå‚æ•°å¯ä»¥è®„¡½®trueæ„义䏸™·Ÿåœ¨å·²æœ‰æ–‡ä»¶åŽ˜q›è¡Œè¾“å…¥
----æ¤ç±»‹¹ä¼šæŠ›å‡ºFileNotFoundException需è¦å¯¹å…¶è¿›è¡Œæ˜¾½Cºæ•æ?/p>
åã€ç¼“冲æµåQšç¼“冲æµè¦å¥—接在相应的节ç‚ÒŽµä¹‹ä¸ŠåQŒæé«˜äº†è¯Õd†™çš„æ•ˆçއã€?br />
æ¤å¤„ç†æµçš„æž„é€ æ–¹æ³•éƒ½å¾—ä¼ ç›¸å¯¹åº”çš„åŸºç±»¾cÕdž‹
BufferedReaderåQšæä¾›äº†readLineæ–ÒŽ³•ç”¨äºŽé«˜æ ¡è¯Õd–一行嗽W¦ä¸²
BufferedWriteråQšæä¾›äº†newLine用于写入一个行分隔½W¦ä¹Ÿž®±æ˜¯æ¢è¡Œ
BufferedInputStream 没多大用�br />
BufferedOutputStream 没多大用�/p>
å一ã€è{æ¢æµåQšä¸»è¦ä½œç”¨å°†å—节‹¹è{æ¢æˆå—符‹¹ã€‚用处较大ï¼
转梋¹åœ¨æž„é€ æ—¶å¯ä»¥æŒ‡å®šå…¶ç¼–ç 集å?br />
InputStreamReader需è¦å’ŒInputStream套接
OutputStreamWriter需è¦å’ŒOutputStream套接
例:OutputStreamWriter osw = new OutputStreamWriter (
new FileOutputStream(æ–‡äšg路径);
æ–ÒŽ³•例:osw.getEncoding(); 获得‹¹çš„¾~–ç æ–¹å¼
åäºŒã€æ•°æ®æµä¸Žå—节数¾l„æµåQ?/span>
数残¹ä¸»è¦äؓ实现å¯ä»¥å˜å–Java原始数殾cÕdž‹å¦‚long,boolean
数残¹æ˜¯å—节‹¹?br />
DataInputStream需è¦å’ŒInputStream套接
DataOutputStream需è¦å’ŒOutputStream套接
DataInputStreamæ–ÒŽ³•:readBoolean() readInt() read...()...
readUTF()åQšç½‘¾lœä¼ 输常用方æ³?è¯ÖM¸€ä¸ªUnicodeå—符ä¸?br />
DataOutputStreamæ–ÒŽ³•与DataInputStream基本对应为写的方æ³?br />
//æ¤æž„é€ å‡½æ•°ç‰äºŽå·²å¯ä»¥å¾€ä¸€ä¸ªå—节数¾l„里输入内容
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
//æ¤æ–¹æ³•äØ“èŽ·å–一个å—节数¾l„方法返回å—节数¾l?br />
baos.toByteArray();
//æ¤æ–¹æ³•获å–å—节数¾l„å 了多ž®‘å—èŠ?br />
new ByteArrayInputStream(一个å—节数¾l?.available()
å二ã€Print‹¹?/span>
Print‹¹åªæœ‰è¾“å‡ºæµæ— 输入æµ,PrintWriterå’ŒPrintStream分别针对å—符å—节
两个¾cÀL供了é‡è²çš„Printå’ŒPrintlnæ–ÒŽ³•ç”¨äºŽå¤šç§æ•°æ®¾cÕdž‹çš„输å‡?br />
PrintWriterå’ŒPrintStream的输出æ“作ä¸ä¼šæŠ›å‡ºå¼‚å¸?br />
PrintWriter和PrintStream有自动flush功能
----System.setOut(接收OutputStream¾c?:用于讄¡½®¾pÈ»Ÿé»˜è®¤è¾“出‹¹?/p>
å二ã€Object‹¹?/span>
½{‰åŒäºŽc#åºåˆ—化,用直接将Object写入或读å‡?br />
transient关键å—䨓ä¸åºåˆ—åŒ–æ¤æˆå‘˜å˜é‡?br />
需è¦åºåˆ—化的类必须实现Serializable接å£
ä¸»è¦æ–ÒŽ³•:writeObject(Object); readObject();
è¯Õd‡ºä¸ºObject¾cÕdž‹éœ€è¦å¼ºè½¬æ•°æ®ç±»åž?/p>