java线程问题:为什么以下代码调用同样的线程输出的结果不一样呢一个是输出1-10,一个输出的全是1

java线程问题:为什么以下代码调用同样的线程输出的结果不一样呢一个是输出1-10,一个输出的全是1,第1张

首先说用M定义的线程,这里M相当于继承线程方法的类,在这个类里给它定义了线程方法。当在public方法里创建M的实例时,类M中的方法也被实例化了,所以当用tstart();启动线程时,是启动的M中的线程。再说for中的,和上边完全相反,这个线程只是开启了线程,并没有定义其它方法,当程序运行时能和上边程序同时运行,所以都是1,这是for循环的结果

程序:

import javaio; import javaawt; import javaawtevent; import javaxswing; class test8{ public static void main(String[] args) { JFrame f=new JFrame(); fsetSize(200, 200); JTextArea t1 = new JTextArea(1,5); JTextArea t2 = new JTextArea(1,5); JButton b1=new JButton("test it"); Label l1,l2; l1 = new Label(); l2 = new Label(); l1setText("Please Enter The Number"); l2setText("The Result Of The Test"); Choice c = new Choice(); cadd("RMB"); cadd("KRW"); cadd("DOLLAR"); Choice c1 = new Choice(); c1add("RMB"); c1add("KRW"); c1add("DOLLAR"); fadd(l1); fadd(t1); fadd(c); fadd(l2); fadd(t2); fadd(c1); fadd(b1); b1addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {if(cgetSelectedItem()=="RMB"&&c1getSelectedItem()=="DOLLAR") {String s; s=t1getText(); int q=0; q=IntegerparseInt(s); double w; w=q01452; String r = DoubletoString(w); t2setText(r); } else if(cgetSelectedItem()=="DOLLAR"&&c1getSelectedItem()=="RMB") {String s; s=t1getText(); int q=0; q=IntegerparseInt(s); double w; w=q68866; String r = DoubletoString(w); t2setText(r); } else if(cgetSelectedItem()=="RMB"&&c1getSelectedItem()=="KRW") {String s; s=t1getText(); int q=0; q=IntegerparseInt(s); double w; w=q1649824; String r = DoubletoString(w); t2setText(r); } else if(cgetSelectedItem()=="KRW"&&c1getSelectedItem()=="RMB") {String s; s=t1getText(); int q=0; q=IntegerparseInt(s); double w; w=q00061; String r = DoubletoString(w); t2setText(r); } else if(cgetSelectedItem()=="DOLLAR"&&c1getSelectedItem()=="KRW") {String s; s=t1getText(); int q=0; q=IntegerparseInt(s); double w; w=q11362500; String r = DoubletoString(w); t2setText(r); } else if(cgetSelectedItem()=="KRW"&&c1getSelectedItem()=="DOLLAR") {String s; s=t1getText(); int q=0; q=IntegerparseInt(s); double w; w=q00009; String r = DoubletoString(w); t2setText(r); } } } ); fsetLayout(new FlowLayout()); fsetVisible(true); faddWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { Systemexit(0); } }); } }

*** 作环境:java 版型号:864

1、Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。 Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等

2、由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。为了解决困难,他们首先着眼于语言的开发,假设了一种结构简单、符合嵌入式应用需要的硬件平台体系结构并为其制定了相应的规范,其中就定义了这种硬件平台的二进制机器码指令系统(即后来成为“字节码”的指令系统),以待语言开发成功后,能有半导体芯片生产商开发和生产这种硬件平台。对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。

*** 作环境:java 版型号:864

*** 作环境:C++ 版型号:8264

java对象中,除了基本类型,其他对象传递都是地址传递,虽然java取消了指针的设定,但是其内部还是使用指针 *** 作的,定义一个对象就相当于定义了一个对象类型的指针,这个指针的值为null,如果不进行初始化的话自然会报空指针异常,也就是NullPointerException。即使是基本类型,如果不初始化直接调用的话一样会报异常的。

上面的main方法中,map对象只是被创建并没有初始化,只是在前面创建了一个Map类的指针但并没有告诉系统具体指向,也就是map的值为null。

如以下方式:

static Map map;

public static void main(String[] args)

{

map=new Map();

mapseach();

}

程序就可以正常运行。

这两种创建对象的方法都是可以的。第一种在方法外创建就是作为一个类的属性,这个时候这个对象的生存周期是相当长的,你可以在一个方法中初始化后在其他方法中继续调用,其他方法对其造成的修改会都会影响到下一次调用的结果。甚至可以在其他类中调用这个变量。当然如果调用到的是没有初始化的对象一样会报空指针。

后一种方式是在方法中创建对象进行 *** 作,这时候这个对象的生存周期只限制于这个方法。每次调用这个方法的时候都会重新创建一个这样的对象。想将这个对象拿出去只有在创建后用set方法或者是使用return 返回。

例如:

Map map=new Map();

mapseach();

//假设OtherObj对象有setMap方法,使用set方法取出map对象

OtherObjsetMap(map);

或者就写成:

public Map getMap(){

Map map = new Map();

return map;

}

此外,static标记表示这个对象是类共有的,调用的时候甚至不需要创建你这个类的对象直接通过类名就可以调用出来。例如jdk中的javaawtColor类里面可以直接取出一些特定的颜色,只需要调用ColorRED等方法即可。不需要另外创建Color对象

import java io ;public class CommandWrapper{Process process;Thread in;Thread out;public CommandWrapper(Process process){this process = process;final InputStream inputStream =process getInputStream();//final BufferedReaderr=new BufferedReader(new InputStreamReader(inputStream));final byte[] buffer = new byte[ ];out = new Thread(){//String line;int lineNumber= ;public void run(){try {while (true){int count = inputStream read(buffer);System out println(lineNumber+ : +new String(buffer count ));//line=r readLine();//System out println(lineNumber+ : +line);lineNumber++;}}catch (Exception e){}}};final BufferedReader reader =new BufferedReader(new InputStreamReader(System in));final OutputStreamoutputStream = process getOutputStream();in = new Thread(){String line;public void run(){try{while (true){outputStream write((reader readLine()+ \n ) getBytes());outputStream flush();}}catch (Exception e){}}};}public void startIn(){in start();}public void startOut(){out start();}public void interruptIn(){in interrupt();}public void interruptOut(){out interrupt();}public static void main(String[] args){try{CommandWrapper mand= new CommandWrapper(Runtime getRuntime() exec( native ascii ));mand startIn();mand startOut();}catch (Exception e){e printStackTrace();}}}我以native ascii为范例程序和网友给我的那个程序做了对比 发现如下几个在处理这个问题时需要注意的地方 由于不知道目标程序的输入输出顺序 因此只能建立两个单独的线程分别处理输入和输出 这样输入和输出就不会阻塞了 但是有些目标程序要求有特定的输入输出顺序 而经过这个类封装的结果是在任何状态下都可以输入 程序的任何输出也会被马上反映出来 这是构造通用类的第一个问题 不能直接使用I/O重定向 在最开始的时候我是考虑直接使用I/O重定向的 但是实际的情况是Process的I/O的定义刚好和我的预想相反 我们从Process取得的InputStream实际上是它的输出 而取得的OutputStream是它的输入 这样就无法进行I/O重定向了 必须我们进行编码来读取程序的输出和写入控制台的输入 (这里的I/O重定向是指想将它的I/O直接重定向到系统的I/O) 写入控制台的输入 outputStream write((reader readLine()+ \n ) getBytes());outputStream flush();这里有两个问题值得注意 第一个是我们在控制台输入一行数据以后按下回车 那么语句reader readLine()可以正确的得到你的输入 为什么要加那个换行符呢?这是在测试的时候发现的问题 在以native ascii作为例子的时候发现不加这个的话它不能得到控制台的输入 但是我在替那位网友解决的问题的时候他的程序则没有这个问题 因此猜想可能是因为有的程序要求读取的一整行的数据(例如native ascii) 而大部分的命令行程序在编码的时候读取的是整数这样的值或者其他类型的值 他们是以空格或者其他的字符分隔的 因此就不需要那个额外的换行符(例如那位网友的程序读取的是一元二次方程的三个系数) 另外一个问题就是flush方法的使用 在最开始的时候没有想到要这样刷新进去 无论是否加换行符外部程序都无法读取写入的输入 后来才想到要调用一下这个方法 这个也是在我们输出的时候应该注意的一个问题 有些需要马上反应出来的输出一般都在写入以后要调用它 否则输出/输入不能马上反应出来 对于程序的输出 最开始我是构造的一个BufferedReader想以行为单位输出 对于那位网友的程序 结果证明不是很好用 但是以native ascii作为例子运行又没有问题 这个估计和外部程序的代码也有关系 如果外部程序没有输出换行符可能使用BufferedReader就会有问题 但是通过直接读取输出就没有问题了 另外需要注意的就是 System out println(lineNumber+ : +new String(buffer count ));中严格来说应该是 System out println(lineNumber+ : +new String(buffer count));之所以减一是因为读取输入的时候人为的多加了一个换行符 如果这个地方不减一就会多输出一个空行 基于以上的种种原因 要构造一个执行外部程序的包装器类不太好办 特别是文章中提到的几个问题 有时间和兴趣的朋友可以做一下测试 看看以上的问题和猜测是否正确 另外附上一段源代码 是一个fortran的程序 implicit nonereal a b creal dreal root root print 请输入一元二次方程的系数a b c: read( ) a b cd=b acif(d>= ) thenroot =( b+sqrt(d))/( a)root =( b sqrt(d))/( a)print root = root print root = root elseprint 一元二次方程没有实根! end ifpauseend lishixinzhi/Article/program/Java/JSP/201311/19704

以上就是关于java线程问题:为什么以下代码调用同样的线程输出的结果不一样呢一个是输出1-10,一个输出的全是1全部的内容,包括:java线程问题:为什么以下代码调用同样的线程输出的结果不一样呢一个是输出1-10,一个输出的全是1、用java写一个汇率的程序:将人民币与美元、欧元、英镑等多种货币的汇率保存在指定文件中,设计图形用、Java对象怎么调用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10141161.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存