WEB开发网
开发学院软件开发Java 基于 Java 2 运行时安全模型的线程协作 阅读

基于 Java 2 运行时安全模型的线程协作

 2009-09-20 00:00:00 来源:WEB开发网   
核心提示: 如图 4,在这样的情景下,基于 Java 2 运行时安全模型的线程协作(7),客户端线程的运行时堆栈完全独立于服务器端的线程,它们之间仅仅通过共享的数据结构消息队列进行异步协作,message.m_accesscontrolcontext=AccessController.getContext(

如图 4,在这样的情景下,客户端线程的运行时堆栈完全独立于服务器端的线程,它们之间仅仅通过共享的数据结构消息队列进行异步协作。例如:当客户端线程放入 Message X,而后,服务器端的线程拿到 Message X 进行处理,我们仍然假设 Message X 是希望服务器端线程将消息写入 c:\paper\server\out.tmp 文件。在这个时候,服务程序怎样才能确保客户端具有写入 c:\paper\server\out.tmp 文件的权限?

Java 提供了基于线程协作场景的解决方案,如清单 8 所示:

清单 8. 线程协作版本的 LogService

package sample.permtest.thread.server; 
…… 
public class LogService implements Runnable 
{ 
  …… 
  public synchronized void log(Message message) 
  { 
    //该方法将在客户端线程环境中执行 
    //在消息放入队列的时候,我们把客户端线程的执行环境通过 
    //AccessController.getContext() 得到, 
    //并及时保存下来。 
    message.m_accesscontrolcontext = AccessController.getContext(); 
    _messageList.add(message); 
    notifyAll(); 
  } 
  …… 
  //从队列中取出消息,并逐一处理 
  public void run() 
  { 
    while (true) 
    { 
      Message message = null; 
      try 
      { 
        message = retrieveMessage(); 
      } 
      catch (InterruptedException interruptedexception) 
      { 
        break; 
      } 
      final String destination = message.getDestination(); 
      final String stringMessage = message.getInfo(); 
      AccessController.doPrivileged 
      ( 
        new PrivilegedAction() 
        { 
          public Object run() 
          { 
            FileWriter filewriter = null; 
             try 
            { 
              filewriter = new FileWriter(destination, true); 
              filewriter.write(stringMessage); 
              filewriter.close(); 
            } 
            catch (IOException ioexception) 
            { 
              ioexception.printStackTrace(); 
            } 
            return null; 
          } 
        }, 
        message.m_accesscontrolcontext 
 //将客户端线程当时的执行环境传入,进行权限检查。 
      ); 
    } 
  } 
} 

上一页  2 3 4 5 6 7 8  下一页

Tags:基于 Java 运行

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接