论坛首页 入门技术论坛

corejava辅导(12--1)

浏览 914 次
精华帖 (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(): 从对象等待队列中释放所有线程并放到锁池中

 

 

JavaI/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;

     }

}

 

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics