欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
JNI 的多線(xiàn)程

JNI作為連接Java 和 本地C資源的一個(gè)非常重要的技術(shù), 需要被好好重視并掌握, 本章將總結一下JNI涉及的多線(xiàn)程問(wèn)題, 在此之前, 需要再次重申, JNI技術(shù)的應用背景:

1.  永遠只考慮Java對C代碼的調用, Java的優(yōu)勢在于GUI層面, C的優(yōu)勢在于執行效率. Java 涉及的是業(yè)務(wù)層入口, C考慮的是底層邏輯的執行。兩個(gè)簡(jiǎn)單的例子

           a.> java技術(shù)本身涉及了眾多JNI調用, 如AWT/Swing這類(lèi)繪圖,最終是通過(guò)JNI調用的, 但Java面向程序員的API, 不會(huì )出現C以及接近底層的Natvie方法

           b.> Android 技術(shù), 也只可能是Java調用C, 不會(huì )反過(guò)來(lái), 因為反過(guò)來(lái), 跟JNI設計的初衷不符合, 把問(wèn)題復雜化了.

 

2. 如果JNI將架構復雜化了, 說(shuō)明技術(shù)上不應該考慮JNI,或者你理解錯了.

3. 多考慮文件的接口, 流的接口, 而不是僅僅是對象的接口, 這樣會(huì )讓JNI的設計更加優(yōu)雅.

 

 

現在是JNI多線(xiàn)程的正題, 一個(gè)JNI多線(xiàn)程的例子程序, 設計一個(gè)多線(xiàn)程, 并且實(shí)現同步, 我理解的多線(xiàn)程需求如下:

 

1. 線(xiàn)程在Java端啟動(dòng), 兩個(gè)線(xiàn)程都調用C的方法

 

2. 有一個(gè)共同的數據, 被C的代碼修改, 要求線(xiàn)程能對這個(gè)修改做同步, 即線(xiàn)程1和線(xiàn)程2不能沖突

 

 

可能會(huì )有人想: 干嘛不在C這端做多線(xiàn)程以及同步呢? 這個(gè)問(wèn)題跟"干嘛不是C調用Java"類(lèi)似, C實(shí)質(zhì)上只是一個(gè)高效的數據處理器, 把東西傳給它處理, 處理完之后, 交給Java就OK. C 中不做復雜的線(xiàn)程同步等操作, 所有的復雜的調度操作, 都應該是上層完成的, C僅僅是傻傻的執行者, 不是管理者?!徱粋€(gè)Java Coder的技術(shù)情節吧!

【后續可能要利用一些存在C多線(xiàn)程的代碼, 這個(gè)另當別論. 暫時(shí)忽略, 后面有時(shí)間再總結這類(lèi)問(wèn)題】

 

通過(guò)代碼的方式, 我們看看這些是怎么實(shí)現的:

 

1. C中存在一個(gè)全局變量value = 1000. 這個(gè)將被三個(gè)方法調用, 一個(gè)加一, 另一個(gè)減一.  另外一個(gè)查看全局變量的值. 這兩個(gè)方法提供給外部的Java調用

 

  1. package com.ostrichmyself.jni;  
  2. public class HelloWorld {  
  3.     public native void addOne();  
  4.     public native void minusOne();  
  5.     public native int getGlobalValue();  
  6. }  

對應的C代碼為:

 

  1. #include"com_ostrichmyself_jni_HelloWorld.h"  
  2. #include <stdio.h>  
  3. int value = 1000;  
  4. JNIEXPORT void JNICALL Java_com_ostrichmyself_jni_HelloWorld_addOne  
  5.   (JNIEnv *env, jobject obj)  
  6.   {  
  7.     value = value +1;  
  8.   }  
  9. JNIEXPORT void JNICALL Java_com_ostrichmyself_jni_HelloWorld_minusOne  
  10.   (JNIEnv *env, jobject obj)  
  11.   {  
  12.     value = value -1;  
  13.   }  
  14. JNIEXPORT jint JNICALL Java_com_ostrichmyself_jni_HelloWorld_getGlobalValue  
  15.   (JNIEnv *env, jobject obj)  
  16.   {  
  17.     return value;  
  18.   }  

 

2. 組織多線(xiàn)程代碼, 讓他對C發(fā)起多個(gè)線(xiàn)程的調用, 并操控全局變量.

  1. package com.ostrichmyself.jni;  
  2. public class MainCygwin {  
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     static{  
  7.         System.loadLibrary("hello");  
  8.     }  
  9.     public static void main(String[] args) {  
  10.         HelloWorld hl = new HelloWorld();  
  11.         Thread t1 = new Thread(new Add("thread add ", hl));  
  12.         Thread t2 = new Thread(new Minus("thread Minus ", hl));  
  13.         t1.start();  
  14.         t2.start();  
  15.     }  
  16.       
  17. }  
  18. class Minus implements Runnable{  
  19.       
  20.     private String threadName;  
  21.     private HelloWorld hl;  
  22.       
  23.     public Minus(String name, HelloWorld hl)  
  24.     {  
  25.         this.threadName = name;  
  26.         this.hl = hl;  
  27.     }  
  28.       
  29.     @Override  
  30.     public void run() {  
  31.         int i = 0;   
  32.         while(i < 100)  
  33.         {  
  34.             i++;  
  35.             operation();  
  36.             try {  
  37.                 Thread.sleep(10);  
  38.             } catch (InterruptedException e) {  
  39.                 e.printStackTrace();  
  40.             }  
  41.         }  
  42.     }  
  43.       
  44.     public void operation()  
  45.     {  
  46.         synchronized(hl)  
  47.         {  
  48.             //加上前后的兩句打印, 是為了觀(guān)察是否被其它線(xiàn)程入侵  
  49.             System.out.println("begin:" + threadName + hl.getGlobalValue());  
  50.             hl.minusOne();  
  51.             try {  
  52.                 //讓線(xiàn)程進(jìn)入休眠, 這個(gè)時(shí)候, 是帶著(zhù)鎖的休眠  
  53.                 //如果其它線(xiàn)程不需要這把鎖,這個(gè)時(shí)候將容易被其他線(xiàn)程入侵  
  54.                 Thread.sleep(100);  
  55.             } catch (InterruptedException e) {  
  56.                 e.printStackTrace();  
  57.             }  
  58.             hl.minusOne();  
  59.             System.out.println("end:" + threadName + hl.getGlobalValue());  
  60.         }  
  61.     }  
  62. }  
  63. class Add implements Runnable{  
  64.       
  65.     private String threadName;  
  66.     private HelloWorld hl;  
  67.       
  68.     public Add(String name, HelloWorld hl)  
  69.     {  
  70.         this.threadName = name;  
  71.         this.hl = hl;  
  72.     }  
  73.       
  74.     @Override  
  75.     public void run() {  
  76.         int i = 0;   
  77.         while(i < 10)  
  78.         {  
  79.             i++;  
  80.             operation();  
  81.             try {  
  82.                 Thread.sleep(10);  
  83.             } catch (InterruptedException e) {  
  84.                 e.printStackTrace();  
  85.             }  
  86.         }  
  87.     }  
  88.       
  89.     public void operation()  
  90.     {  
  91.         synchronized(hl)  
  92.         {  
  93.             //加上前后的兩句打印, 是為了觀(guān)察是否被其它線(xiàn)程入侵  
  94.             System.out.println("begin:" + threadName + hl.getGlobalValue());  
  95.             hl.addOne();  
  96.             System.out.println("end:" + threadName + hl.getGlobalValue());  
  97.         }  
  98.     }  
  99. }  

 

同步的變量是hl對象, 可以試一下, 注釋掉synchronized(hl)  打印的加法操作和減法操作會(huì )出現交叉混亂。

 

當然, 全局變量可以通過(guò)Java端傳入,  這樣更接近現實(shí)中的例子, 不過(guò)這個(gè)例程已經(jīng)有足夠的代表性。

 

編譯環(huán)境:

C: cygwin下gcc編譯
Java: Eclipse, Windows

 

 

源碼地址:

 

http://download.csdn.net/source/2393959

 


原文鏈接:http://blog.csdn.net/ostrichmyself/article/details/5623804

(###)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JNI官方規范中文版——從一個(gè)簡(jiǎn)單的例子開(kāi)始
解決找不到j(luò )ni.h和jni
Java Native Interface Specification
關(guān)于native層回調java層
JNI入門(mén)
java調用底層的幾種方法
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久