public static void main(String[] args) {
boolean isRight = true//用于判断用户是否输入正确初始为正确
Scanner input = new Scanner(System.in)
System.out.println("欢迎使用MyShopping管理系统")
System.out.println("********************************************")
System.out.println("1.客户信息管理")
System.out.println("2.购物结算")
System.out.println("3.真情回馈")
System.out.println("4.注销")
System.out.println("********************************************\n")
System.out.println("请选择,输入数字:")
int nextInt = input.nextInt()
do {
if (!(nextInt >= 1 &&nextInt <= 4)) { //判断是否为数字并且在1-4之间
System.out.println("输入错误请重新输入!")
isRight = false
System.out.println("请选择,输入数字:")
nextInt = input.nextInt()
} else {
isRight = true
switch (nextInt) { //根据输入的正确条件
case 1:
System.out.println("执行客户信息管理")
break
case 2:
System.out.println("执行购物结算")
break
case 3:
System.out.println("执行真情回馈")
break
case 4:
System.out.println("执行注销")
break
}
}
} while (!isRight)//判断条件 如果输入错误则重新执行语句
System.out.println("程序结束")//循环体执行完毕后提醒关闭程序
}
}
jstack用于打印出给定的java进程ID或corefile或远程调试服务的Java堆栈信息。如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:jstack[-l]pid如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的javastack和nativestack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的javastack和nativestack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。需要注意的问题:l不同的JAVA虚机的线程DUMP的创建方法和文件格式是不一样的,不同的JVM版本,dump信息也有差别。l在实际运行中,往往一次dump的信息,还不足以确认问题。建议产生三次dump信息,如果每次dump都指向同一个问题,我们才确定问题的典型性。2、命令格式$jstack[option]pid$jstack[option]executablecore$jstack[option][server-id@]remote-hostname-or-IP参数说明:pid:java应用程序的进程号,一般可以通过jps来获得executable:产生coredump的java可执行程序core:打印出的core文件remote-hostname-or-ip:远程debug服务器的名称或IPserver-id:唯一id,假如一台主机上多个远程debug服务示例:$jstack–l23561线程分析:一般情况下,通过jstack输出的线程信息主要包括:jvm自身线程、用户线程等。其中jvm线程会在jvm启动时就会存在。对于用户线程则是在用户访问时才会生成。ljvm线程:在线程中,有一些JVM内部的后台线程,来执行譬如垃圾回收,或者低内存的检测等等任务,这些线程往往在JVM初始化的时候就存在,如下所示:1"AttachListener"daemonprio=10tid=0x0000000052fb8000nid=0xb8fwaitingoncondition[0x0000000000000000]23java.lang.Thread.State:RUNNABLE4567Lockedownablesynchronizers:89-None1011destroyJavaVM"prio=10tid=0x00002aaac1225800nid=0x7208waitingoncondition[0x0000000000000000]1213java.lang.Thread.State:RUNNABLE14151617Lockedownablesynchronizers:1819-Nonel用户级别的线程还有一类线程是用户级别的,它会根据用户请求的不同而发生变化。该类线程的运行情况往往是我们所关注的重点。而且这一部分也是最容易产生死锁的地方。1"qtp496432309-42"prio=10tid=0x00002aaaba2a1800nid=0x7580waitingoncondition[0x00000000425e9000]23java.lang.Thread.State:TIMED_WAITING(parking)45atsun.misc.Unsafe.park(NativeMethod)67-parkingtowaitfor(ajava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)89atjava.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)1011atjava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025)1213atorg.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:320)1415atorg.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:479)1617atjava.lang.Thread.run(Thread.java:662)18192021Lockedownablesynchronizers:2223-None从上述的代码示例中我们可以看到该用户线程的以下几类信息:Ø线程的状态:waitingoncondition(等待条件发生)Ø线程的调用情况;Ø线程对资源的锁定情况;欢迎分享,转载请注明来源:内存溢出
评论列表(0条)