NativeThread.java

  1. /***** BEGIN LICENSE BLOCK *****
  2.  * Version: EPL 1.0/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Eclipse Public
  5.  * License Version 1.0 (the "License"); you may not use this file
  6.  * except in compliance with the License. You may obtain a copy of
  7.  * the License at http://www.eclipse.org/legal/epl-v10.html
  8.  *
  9.  * Software distributed under the License is distributed on an "AS
  10.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  11.  * implied. See the License for the specific language governing
  12.  * rights and limitations under the License.
  13.  *
  14.  * Copyright (C) 2007 Charles O Nutter <headius@headius.com>
  15.  *
  16.  * Alternatively, the contents of this file may be used under the terms of
  17.  * either of the GNU General Public License Version 2 or later (the "GPL"),
  18.  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  19.  * in which case the provisions of the GPL or the LGPL are applicable instead
  20.  * of those above. If you wish to allow use of your version of this file only
  21.  * under the terms of either the GPL or the LGPL, and not to allow others to
  22.  * use your version of this file under the terms of the EPL, indicate your
  23.  * decision by deleting the provisions above and replace them with the notice
  24.  * and other provisions required by the GPL or the LGPL. If you do not delete
  25.  * the provisions above, a recipient may use your version of this file under
  26.  * the terms of any one of the EPL, the GPL or the LGPL.
  27.  ***** END LICENSE BLOCK *****/
  28. package org.jruby.internal.runtime;

  29. import java.lang.ref.Reference;
  30. import java.lang.ref.WeakReference;
  31. import org.jruby.RubyThread;
  32. import org.jruby.runtime.Block;
  33. import org.jruby.runtime.builtin.IRubyObject;

  34. /**
  35.  * @author cnutter
  36.  */
  37. public class NativeThread implements ThreadLike {
  38.     private Reference<Thread> nativeThread;
  39.     public RubyThread rubyThread;
  40.    
  41.     public NativeThread(RubyThread rubyThread, IRubyObject[] args, Block block) {
  42.         throw new RuntimeException();
  43.     }
  44.    
  45.     public NativeThread(RubyThread rubyThread, Thread nativeThread) {
  46.         this.rubyThread = rubyThread;
  47.         this.nativeThread = new WeakReference<Thread>(nativeThread);
  48.     }
  49.    
  50.     public void start() {
  51.         Thread thread = getThread();
  52.         if (thread != null) thread.start();
  53.     }
  54.    
  55.     public void interrupt() {
  56.         Thread thread = getThread();
  57.         if (thread != null) thread.interrupt();
  58.     }
  59.    
  60.     public boolean isAlive() {
  61.         Thread thread = getThread();
  62.         if (thread != null) return thread.isAlive();
  63.         return false;
  64.     }
  65.    
  66.     public void join() throws InterruptedException {
  67.         Thread thread = getThread();
  68.         if (thread != null) thread.join();
  69.     }
  70.    
  71.     public void join(long timeoutMillis) throws InterruptedException {
  72.         Thread thread = getThread();
  73.         if (thread != null) thread.join(timeoutMillis);
  74.     }
  75.    
  76.     public int getPriority() {
  77.         Thread thread = getThread();
  78.         if (thread != null) return thread.getPriority();
  79.         return 0;
  80.     }
  81.    
  82.     public void setPriority(int priority) {
  83.         Thread thread = getThread();
  84.         if (thread != null) thread.setPriority(priority);
  85.     }
  86.    
  87.     public boolean isCurrent() {
  88.         return getThread() == Thread.currentThread();
  89.     }
  90.    
  91.     public boolean isInterrupted() {
  92.         Thread thread = getThread();
  93.         if (thread != null) {
  94.             return thread.isInterrupted();
  95.         }
  96.         return false;
  97.     }

  98.     public Thread getThread() {
  99.         return nativeThread.get();
  100.     }

  101.     public String toString() {
  102.         return "" + getThread();
  103.     }

  104.     public Thread nativeThread() {
  105.         return nativeThread.get();
  106.     }
  107. }