java代码设置死循环 死循环JAVA

java的死循环问题

当某一扫描器抛出 InputMismatchException 时,该扫描器不会传递导致该异常的标记,因此可以通过其他某种方法来获取或跳过它。

创新互联专业为企业提供碌曲网站建设、碌曲做网站、碌曲网站设计、碌曲网站制作等企业网站建设、网页设计与制作、碌曲企业网站模板建站服务,10年碌曲做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

这是java API文档中的原话。意思是说,如果nextInt方法没有成功解析出一个整数,那么你的输入不会被忽略。因为它或许能被其它格式解析。

那么你的程序中输入了a后,出现异常,number被赋值100,开始下一次循环,但这时数据缓冲区内你上次输入的a还在,并没有清除,这时继续解析a,还是错误,于是这个过程就一直重复下去了。

现在你要改的是,出现错误把这次的输入清除,只要在catch中,加一句:input.next()就搞定了!

java while 死循环

输入两位数时,比如11,c=a/10就是1,a的值不变,每次循环c的值都是1,所以就死循环了

java中如何设计可以灵活控制的一个死循环,求大侠帮忙

va.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JTextArea;

import javax.swing.JTextField;

import javax.swing.WindowConstants;

import javax.swing.event.DocumentEvent;

import javax.swing.event.DocumentListener;

import javax.swing.text.BadLocationException;

import javax.swing.text.Document;

import javax.swing.text.PlainDocument;

public class AreaField extends javax.swing.JFrame {

private JTextField input;

private JTextArea output;

public static void main(String[] args) {

AreaField inst = new AreaField();

inst.setLocationRelativeTo(null);

inst.setVisible(true);

}

public AreaField() {

super();

initGUI();

}

private void initGUI() {

setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

{

input = new JTextField();

getContentPane().add(input, BorderLayout.NORTH);

input.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) {

//这句话就是让文本域中显示文本框内容

output.setText("");

}

});

PlainDocument doc = (PlainDocument) input.getDocument();

doc.addDocumentListener(new DocumentListener(){

public void changedUpdate(DocumentEvent e) {

}

public void insertUpdate(DocumentEvent e) {

try {

//这里进行同步处理

Document doc = e.getDocument();

int offset = e.getOffset();

String text = doc.getText(offset, e.getLength());

Document adoc = output.getDocument();

adoc.insertString(adoc.getLength(), text, null);

} catch (BadLocationException e1) {

e1.printStackTrace();

}

}

public void removeUpdate(DocumentEvent e) {

}});

}

{

output = new JTextArea();

getContentPane().add(output, BorderLayout.CENTER);

output.setLineWrap(true);

}

pack();

setSize(400, 300);

}

}

java中怎么设计一个死循环?

最简答的

int i = 0; //记录循环的次数

while(true){

//为了让你看到循环的打印信息

System.out.println(++i+"次死循环");

}

原来jdk自带了这么好玩的工具——使用 jstack定位死循环

线程快照是java虚拟机内每一个线程正在执行的方法堆栈的集合,生成线程快照的主要目的是用于定位线程出现问题的位置;常见的问题有

命令格式

jstack的option参数并不多,真正用到的也就三个,接下来我们一个个介绍一下

- -F :当线程挂起(Suspended)时,使用jstack -l pid命令是不会打印堆栈信息的,使用-F则可以强制输出线程堆栈;但是会停止但

- -l :打印的信息除了堆栈外,还会显示锁的附加信息;

- -m :同时输出java和C/C++的堆栈信息;在java的系统类库里面,有很多方法都是native修饰的,这些native修饰的方法你在java层面是看不到源码的,因为这些方法都是C/C++实现的;

在线程的堆栈中,需要特别留意以下几种状态:

不带option参数的命令

打印结果如下

第一行各个单词的解析,

这里我们使用2个窗口,分别使用以下2个命令来测试

通过2个窗口对比可以看到,加了-l的命令多打印了锁的信息;

一般情况下,如果程序出错了, 都不会直接在生产环境的服务器上找错误,这个时候就可以用到一个非常实用的功能,将堆栈快照导出来,然后copy到别的电脑上看,命令如下

执行后,就可以看到文件已经导出来了

通过cat命令可以看到,里面的内容和我们在命令行输出的内容是一样的

首先我们准备好一个死循环的线程,在线程内定一个while的死循环,并且给这个线程起个名字为:yexindogn,阿里巴巴的开发规范里面有一个规定,就是每个线程必须起一个名字,起名字就是为了 以后程序出问题的时候好找错误;

接着我们将此代码打成jar包扔到linux服务器上运行,直接输入 java -jar Test.jar 命令即可运行,运行后我们可以看到控制台一直在输出112这个字符,这就代表程序已经在运行了;

接着在看下CPU的运行情况,使用top命令查看cpu占用情况,排在第一位的是进程号为30328的进程,占用了6.6%的cpu; 这边我使用了2个命令行连到同一台服务器,一个窗口用来运行刚刚的jar包,另一个窗口用来查找错误;

知道进程号了,接着就是找线程了,输入以下命令

打印结果如下,这里有一点需要注意,在我们加上-Hp指令后,PID展示就是线程的id了,这时候我们看到占用CPU最高的线程id是30365;

还有另一种方式,就是使用ps命令来查找线程

通过这个命令我们可以看到这边占用最高的线程id也是30365 ;

以上的方式我们成功找到了占用cpu高的线程id是30365,但这个id是十进制的,在这里需要先转为16进制,输入命令

计算出对应的16进制为:769d

当然也可以用其他的计算工具,比如mac系统自带计算器就支持进制之间的转换

在命令行输入以下命令,这种方法更加快速,推荐使用

其中,grep 命令是查找结果为769d的内容,-A 20 表示打印匹配所在行的后20行内容。直接帮我们定位到所在线程的堆栈,结果如下

当然也可以用下面的死办法,先打印出所有的堆栈快照;

打印结果如下

接着我用刚刚计算出来的16进制复制出来在这里搜索一下,经过查看就知道是我们刚刚起了名字为yexindong的线程出错了,出错的位置在Test.java的第13行代码

我们看看java代码,确实是第13行这里的死循环导致的

首先打开任务管理器,因为默认windows的任务管理器是不显示进程pid的,所以我们需要设置一下,选择 查看 选择列(S)...

选中PID进程表示符后点击确定按钮

然后我们就可以看到占用CPU最高的java进程PID为:976

因为windows不能直接查看java进程中的线程信息,所以我们需要借助一个工具,这个工具是微软自己开发的,叫做Process Explorer ,网上很多,需要的童鞋请自行百度,打开后找到pid为976的进程右击选择 属性

在弹出的窗口中找到线程这一栏,它的排序默认就是按照cpu占用的率倒序排列的,所以最上面的就是占用cpu最高的线程了,记住它的线程id:3548

刚刚拿到的进程id是十进制的,但是我们导出的jstack信息里面,线程id是以16进制来展示的,所以我们要先将这个线程id为3548转为16进制的,使用windows自带的计算器即可,在快捷命令行输入calc

计算器打开后将其设置为程序员使用的计算器

接着输入线程id3548,在按一下16进制,就会自动进行转换,结果为ddc,记住这个16进制;

在命令行输入以下指令导出进程的堆栈快照信息

几秒钟后,快照导出了,静静地躺在文件夹里,等待着我们打开

用Notepad++打开导出的文件,搜索刚刚计算出来的16进制ddc,就可以定位到线程出错的位置了

有些童鞋可能会觉得用这个jstack命令麻烦了,那java在代码里面可不可以打印出堆栈呢?你别说,还真有,就是这个方法:Thread.getAllStackTraces();光说不练假把式,来个demo测试一下吧

执行后打印结果如下,由此可以看到,将当前进程的所有线程都打印出来了,但是这边只打印了简单的堆栈信息,对于开发人员来说,已经起到了监控作用;

作为调优和找错的工具来说,可以说jstack是用的最多的一个工具了,但是由于局限性,现在已经慢慢被替换掉了;大家更倾向于使用阿里巴巴开发的工具arthas;感兴趣的童鞋可以了解下!

java多线程中的死循环

是这样的,ss.accept()方法是阻塞的,也就是说ss所在的线程运行到accept()函数就会一直等待,直到ss接收到了一个Socket请求。正因为accept()是阻塞的,所以一般会把这个函数放在一个单独的线程,这样就不会影响主线程(例如程序界面)的运行,Socket编程几乎是肯定和多线程编程一起用的。accept()放进了单独的线程了自然就不会影响后面代码的执行,因为这时accept()的时间片和后续代码的时间片会由JVM调配,而不是按照代码编排的先后顺序了。

另外你对死循环的理解有偏差,所谓死循环是指循环条件永远为真而导致循环一直不结束,而由于循环内部的方法阻塞导致的循环不结束不属于死循环,这两个有本质的差别。通常Socket.accept()是该放进一个死循环的,也就是你的while(true);


本文名称:java代码设置死循环 死循环JAVA
转载来源:http://ybzwz.com/article/hhdcde.html