锁定老帖子 主题: corejava辅导(12--1)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-03
最后修改:2008-12-03
死锁问题
多线程不释放自己拥有的锁标记,而想申请其他线程拥有的锁标记,就会造成死锁。
没有获得加锁对象的锁标记的线程,不能访问只有获得该对象所标记才能访问的同步方法,但可以访问这个对象的非同步的方法。
死锁的两种处理方法 统一排列锁顺序(解决不同方法中对多个共享资源的访问) 对象1的方法 synchronized(a) synchronized(b) 对象2的方法 synchronized(a) synchronized(b)
java线程间通信(也就是线程间的相互协调)
等待通知机制
线程间通信使用的空间称之为对象的等待对列(wait pool),该队列也是属于对象的空间的。
进入等待池
使用Object类中wait()的方法,在运行状态中,线程调用wait(),此时表示线程将释放自己所有的锁标记和CPU的占用,同时进入这个对象的等待池。等待池的状态也是阻塞状态,只不过线程释放自己的锁标记。在对该对象加锁的同步代码块里,才能调用该对象的wait()方法,表示线程将会释放所有锁标记,进入等待队列,线程将进入等待队列状态。
一个线程进入了对一个对象加锁的同步代码块,并对该对象调用了wait()方法,释放自己拥有的所有锁标记,进入该对象等待队列,另一个线程获得了该对象的锁标记,进入代码块对该对象调用了notify()方法(对该对象调用了notifyAll()方法,会释放等待队列里所有的线程),对该对象调用方法的线程也不会释放所拥有的锁标记(对自身没有影响),也就是从等待队列里释放出一线程,释放出的这个线程要继续运行也就还要进入那个同步代码块,因为得不到要访问代码块对象的锁标记,而进入该对象的锁池,等待所标记释放。
注意:用notifyAll()取代notify(),因为在调用notify()方法时,是由系统决定释放出哪个线程。
退出等待池进入锁池
注意:只能对加锁的资源进行wait()和notify()。 1) wait():交出锁和CPU的占用,进入该对象的、等待队列。 2) notify():从对象的等待队列中释放任意的一个线程。 3) notifyAll(): 从对象等待队列中释放所有线程并放到锁池中。
Java的I/O流与文件
Java中的文件操作
File类(java.io.File)可表示文件或者目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显)。
File下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文件的内容。
注意:File类的对象实施表示一个文件并不是真正的文件,只是代理而已,通过代理来操作文件创建一个文件对象和创建一个文件在JAVA中是两个不同的概念。前者是在虚拟机中创建了一个文件,但却并没有将它真正地创建到OS的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。而创建一个文件才是在系统中真正地建立一个文件。
例如: File f=new File(“11.txt”);//创建一个名为11.txt的文件对象 f.CreateNewFile();//真正地创建文件
File类的方法
boolean createNewFile() //创建文件 boolean mkdir() //创建目录 boolean mkdirs() //创建多个目录 boolean delete() //删除文件,删除的是创建File对象时指定与之关联创建的那个文件。 boolean deleteOnExit(); //在JVM进程退出的时候删除文件,这样的操作通常用在临时文件的删除。 String[] List()://返回当前File对象下所以显文件和目录名(相对路径) File[] ListFiles()://返回当前File对象(必须是目录)所有Files对象,可以用getName()来访问到文件名。 isDirectory()和isFile()//来判断究竟是目录还是文件。 String getParent()//得到父类文件名,只有在构造对象时传入了Parent对象才有。 File getParentFile()//父路径名的抽象路径名,如果没有指定Parent对象,则返回 null。 String getPath()//获得相对路径。 exists() //判断文件或文件夹是否存在。 getAbsolutePath() //获得文件的绝对路径
使用File类的实例 例:这个类是实现了删除_desktop.ini文件的功能 import java.io.*; public class LsitFile { public static void main(String[] args) throws Exception{ File f=new File("C:\\"); print(f); } static void print(File f){ File[] fs=f.listFiles(new MyFilter()); for(int i=0;i<fs.length;i++){ if (fs[i].isFile()){ fs[i].delete(); } else{ print(fs[i]); } } } }
class MyFilter implements FileFilter{ public boolean accept(File arg0) { if (arg0.isDirectory()) return true; String name=arg0.getName(); if (name.equals("_desktop.ini")) return true; else return false; } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 914 次