changeset 16:c65256380a80

update
author riono <e165729@ie.u-ryukyu.ac.jp>
date Wed, 05 May 2021 14:57:28 +0900
parents 2dd23f9603b3
children 0c8af7a0803b
files Paper/riono-sigos.pdf Paper/riono-sigos.tex Paper/src/ThreadPoolExecuter.cs Paper/src/ThreadPoolExecutor.cs Paper/src/ThreadPoolExecutor.java
diffstat 5 files changed, 62 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
Binary file Paper/riono-sigos.pdf has changed
--- a/Paper/riono-sigos.tex	Tue May 04 23:41:09 2021 +0900
+++ b/Paper/riono-sigos.tex	Wed May 05 14:57:28 2021 +0900
@@ -148,10 +148,6 @@
 Code \ref{code:javaHWC} の2回の実行後、Code \ref{code:javaHWC} のローカル変数hello とworld が全て揃ったことによりCode \ref{code:javaHWC} が実行されプログラムは終了する。
 
 
-\section{Unity}
-
-
-
 \section{C\# でのChristie}
 
 Code \ref{code:javaSHW} 、Code \ref{code:javaHWC} 、Code \ref{code:javaFHW} がC\#ではこうなります
@@ -159,6 +155,8 @@
 \lstinputlisting[caption=C\# StartHelloWorld, label=code:csSHW]{src/StartHelloWorld.cs}
 
 
+\section{Unity}
+
 
 \section{Unityでの動作}
 
@@ -169,18 +167,18 @@
 java 版ではDataGear を取得する際に、annotation という java の機能を用いて行った。C\#には annotation はなく、代わりにattribute を利用して DataGear の取得を行っている。
 以下のCode \ref{code:javaTake}、Code \ref{code:csTake}はjava とC\# におけるTakeの実装である。
 
-\lstinputlisting[caption=java における Take annotation, label=code:javaTake]{src/Take.java}
+\lstinputlisting[caption=java における Take annotation の実装, label=code:javaTake]{src/Take.java}
 
-\lstinputlisting[caption=C\# における Take attribute, label=code:csTake]{src/Take.cs}
+\lstinputlisting[caption=C\# における Take attribute の実装, label=code:csTake]{src/Take.cs}
 
 java でannotation を自作する際には、 @interfacs で宣言する。また、Code \ref{code:javaTake} の8行目ではannotation情報をどの段階まで保持するかを指定しており、Take の場合 JVMによって保存され、ランタイム環境で使用できる。9行目ではannotationの適用可能箇所を指定しており、フィールド変数に対して適応可能となっている。
 
 C\# でattribute を作成する際には、 System.Attributeを継承する必要がある。attribute の適用可能箇所については、Code \ref{code:csTake} の4行目でフィールド変数を指定している。
 
 \section{MessagePackの相違点}
-Christie ではデータを送信する際に、MessagePack を使用してデータを圧縮し、送信している。java 版で使用しているMessagePack はバージョンが古く現在はサポートされてない。そのためMessagePack の最新版とは記述方法が異なっている。Code \ref{code:mspackEx} はMessagePack の使用方法を示したものである。
+Christie ではデータを送信する際に、MessagePack を使用してデータを圧縮し、送信している。java 版で使用しているMessagePack はバージョンが古く現在はサポートされてない。そのためMessagePack の最新版とは記述方法が異なっている。Code \ref{code:javamspackEx} はMessagePack の使用方法を示したものである。
 
-\lstinputlisting[caption=java 版におけるMessagePack の使用方法, label=code:javamspackEx]{src/MessagePackEx.java}
+\lstinputlisting[caption=java におけるMessagePack の使用方法, label=code:javamspackEx]{src/MessagePackEx.java}
 
 MessagePack を使用するには圧縮するクラスに対して @Message annotationをつける必要がある。これにより、クラス内で定義したpublic変数が圧縮される。
 Code \ref{code:javamspackEx} の17 - 21行目は圧縮解凍の例であり、MessagePackのインスタンスを作成後、msgpack.write(data) を行うことでbyte[] 型にdataを圧縮できる。
@@ -189,29 +187,16 @@
 
 C\# のMessagePack は複数存在しており、java と同様な書き方をするMessagePack-CSharp を選択した。
 
-\lstinputlisting[caption=C\# 版におけるMessagePack の使用方法, label=code:csmspackEx]{src/MessagePackEx.cs}
+\lstinputlisting[caption=C\# におけるMessagePack の使用方法, label=code:csmspackEx]{src/MessagePackEx.cs}
 
 MessagePack-CSharp ではjava 版と同様にクラスに対して圧縮を行うためCode \ref{code:csmspackEx} の1行目で MessagePackObject attribute を追加している。また、圧縮する変数に対してkey を設定することができ、int やstring を指定することができる。
 
 
-データの圧縮にはMessagePackSerializer.Serialize (data) を使用し、byte[] 型に圧縮される。解凍にはMessagePackSerializer.Deserialize$<T>$(data) を使用する。Deserializeはジェネリスク関数であるため、$<>$内に解凍するデータのクラスを指定する。
+データの圧縮にはMessagePackSerializer.Serialize (data) を使用し、byte[] 型に圧縮される。解凍にはMessagePackSerializer.Deserialize$<$T$>$(data) を使用する。Deserializeはジェネリスク関数であるため、$<>$内に解凍するデータのクラスを指定する。
 Code \ref{code:csmspackEx} の21行目では、変数それぞれにkey を設定していることでjson に展開することが可能である。
 
  
 \section{CodeGear 実行時のThreadPool からTask への変更}
-java では別Thread を
-
-
-
-\section{チート対策について}
-
-\section{実装の現状}
+java 版ではCodeGearの実行にThreadPool を使用していた。C\# では書き換えの際にThreadPool よりも高機能なTask で書き換えを行った。
 
-
-\nocite{*}
-\bibliographystyle{ipsjunsrt}
-\bibliography{riono-sigos}
-
-
-
-\end{document}
+\lstinputlisting[caption=java におけるCodeGear を処理するThreadPool の実装の一部, label=code:javaExecutor]{src/ThreadPoolExecutor.java}
--- a/Paper/src/ThreadPoolExecuter.cs	Tue May 04 23:41:09 2021 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-public class ThreadPoolExecutors {
-
-    public ThreadPoolExecutors() {
-        int nWorkerThreads;
-        int nIOThreads;
-        ThreadPool.GetMinThreads(out nWorkerThreads, out nIOThreads);
-        ThreadPool.SetMinThreads(nWorkerThreads, nIOThreads);
-    }
-    
-    public ThreadPoolExecutors(int nWorkerThreads, int nIOThreads) {
-        ThreadPool.SetMinThreads(nWorkerThreads, nIOThreads);
-    }
-    
-    public void Execute(CodeGearExecutor command) {
-        Task.Factory.StartNew(() => command.Run());
-    }
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/ThreadPoolExecutor.cs	Wed May 05 14:57:28 2021 +0900
@@ -0,0 +1,17 @@
+public class ThreadPoolExecutors {
+
+    public ThreadPoolExecutors() {
+        int nWorkerThreads;
+        int nIOThreads;
+        ThreadPool.GetMinThreads(out nWorkerThreads, out nIOThreads);
+        ThreadPool.SetMinThreads(nWorkerThreads, nIOThreads);
+    }
+    
+    public ThreadPoolExecutors(int nWorkerThreads, int nIOThreads) {
+        ThreadPool.SetMinThreads(nWorkerThreads, nIOThreads);
+    }
+    
+    public void Execute(CodeGearExecutor command) {
+        Task.Factory.StartNew(() => command.Run());
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/ThreadPoolExecutor.java	Wed May 05 14:57:28 2021 +0900
@@ -0,0 +1,35 @@
+public class PriorityThreadPoolExecutors {
+
+    public static ThreadPoolExecutor createThreadPool(int nThreads, int keepAliveTime) {
+        return new PriorityThreadPoolExecutor(nThreads, nThreads, keepAliveTime, TimeUnit.MILLISECONDS);
+    }
+    private static class PriorityThreadPoolExecutor extends ThreadPoolExecutor {
+        private static final int DEFAULT_PRIORITY = 0;
+        private static AtomicLong instanceCounter = new AtomicLong();
+
+        public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
+                                int keepAliveTime, TimeUnit unit) {
+            super(corePoolSize, maximumPoolSize, keepAliveTime, unit, (BlockingQueue) new PriorityBlockingQueue<ComparableTask>(10,
+		ComparableTask.comparatorByPriorityAndSequentialOrder()));
+        }
+
+        @Override
+        public void execute(Runnable command) {
+            // If this is ugly then delegator pattern needed
+            if (command instanceof ComparableTask) //Already wrapped
+                super.execute(command);
+            else {
+                super.execute(newComparableRunnableFor(command));
+            }
+        }
+
+        private Runnable newComparableRunnableFor(Runnable runnable) {
+            return new ComparableRunnable((CodeGearExecutor) runnable);
+        }
+
+        @Override
+        protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
+            return new ComparableFutureTask<>((CodeGearExecutor)runnable, value);
+        }
+    }
+}