मैं के लिए ट्रांसफार्मर के विकास कर रहा हूँ जावा 6 * 1) कि आंशिक मूल्यांकन का एक प्रकार प्रदर्शन करती है लेकिन सादगी के लिए विचार करते हैं, करते हैं, सार-वाक्य रचना-पेड़ एक जावा प्रोग्राम की व्याख्या।java.lang अनुकरण करने का सबसे अच्छा तरीका क्या है। पढ़ा?
किसी व्याख्या किए गए प्रोग्राम द्वारा Thread
के व्यवहार को अनुकरण कैसे करें?
AstInterpreterjava.lang.Runnable
को लागू करना चाहिए:
। यह भी java.lang.Thread
(या इसके उप-वर्ग) के हर नए उदाहरण अभिव्यक्ति को फिर से लिखने चाहिए नई AstInterpreter उदाहरण के साथ Thread
के लक्ष्य (java.lang.Runnable
) की जगह:
संपादित करें: और अधिक जटिल उदाहरण प्रदान की है।
संपादित करें 2: टिप्पणी 1.
लक्ष्य कार्यक्रम:
class PrintDemo {
public void printCount(){
try {
for(int i = 5; i > 0; i--) {
System.out.println("Counter --- " + i);
}
} catch (Exception e) {
System.out.println("Thread interrupted.");
}
}
}
class ThreadDemo extends Thread {
private Thread t;
private String threadName;
PrintDemo PD;
ThreadDemo(String name, PrintDemo pd){
threadName = name;
PD = pd;
}
public void run() {
synchronized(PD) {
PD.printCount();
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start()
{
System.out.println("Starting " + threadName);
if (t == null)
{
t = new Thread (this, threadName);
t.start();
}
}
}
public class TestThread {
public static void main(String args[]) {
PrintDemo PD = new PrintDemo();
ThreadDemo T1 = new ThreadDemo("Thread - 1 ", PD);
ThreadDemo T2 = new ThreadDemo("Thread - 2 ", PD);
T1.start();
T2.start();
// wait for threads to end
try {
T1.join();
T2.join();
} catch(Exception e) {
System.out.println("Interrupted");
}
}
}
कार्यक्रम 1 (ThreadTest - बाईटकोड व्याख्या):
new Thread(new Runnable() {
public void run(){
ThreadTest.main(new String[0]);
}
});
कार्यक्रम 2 (ThreadTest - एएसटी व्याख्या की):
final com.sun.source.tree.Tree tree = parse("ThreadTest.java");
new Thread(new AstInterpreter() {
public void run(){
interpret(tree);
}
public void interpret(com.sun.source.tree.Tree javaExpression){
//...
}
});
परिणामस्वरूप प्रोग्राम 2 शुरुआती प्रोग्राम 1 के थ्रेड के व्यवहार को अनुकरण करता है?
1) वर्तमान में, source=8/target=8
योजना स्वीकार की गई है।
हां, आप अपनी खुद की कक्षा लिख सकते हैं जो रननेबल लागू करता है और वह रननेबल क्लास थ्रेड के अंदर चलाया जा सकता है।मैं यह देखने में असफल रहा कि आपकी AstInterpreter कक्षा क्या करती है कि एक नया रननेबल नहीं कर सकता है। –
आप जावा 6 पर क्यों चल रहे हैं? कोई कारण नहीं है। जावा 7 और 8 पर आपके सभी "जावा 6" कोड चलाए जाएंगे, – SnakeDoc
मैं वास्तव में जावा 6 के तहत चल रहा हूं। मैंने जावा 6 फीचर्स द्वारा ट्रांसफॉर्मर सीमित कर दिया है और इस प्रकार लैंग्टोल्स एपीआई के कारण एसडीके 6 का उपयोग करने के लिए मजबूर किया है। –