Java程序执行超时——Future接口介绍

在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实 现,可以来进行异步计算。
Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情。其中Future 接口就是订货单,真正处理订单的是Executor类,它根据Future接口的要求来生产产品。
Future接口提供方法来检测任务是否被执行完,等待任务执行完获得结果,也可以设置任务执行的超时时间。这个设置超时的方法就是实现Java程 序执行超时的关键。
Future接口是一个泛型接口,严格的格式应该是Future,其中V代表了Future执行的任务返回值的类型。 Future接口的方法介绍如下:

  • boolean cancel (boolean mayInterruptIfRunning) 取消任务的执行。参数指定是否立即中断任务执行,或者等等任务结束
  • boolean isCancelled () 任务是否已经取消,任务正常完成前将其取消,则返回 true
  • boolean isDone () 任务是否已经完成。需要注意的是如果任务正常终止、异常或取消,都将返回true
  • V get () throws InterruptedException, ExecutionException 等待任务执行结束,然后获得V类型的结果。InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException
  • V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计 算超时,将抛出TimeoutException

Future的实现类有java.util.concurrent.FutureTask即 javax.swing.SwingWorker<t,v>。通常使用FutureTask来处理我们的任务。FutureTask类同时又 实现了Runnable接口,所以可以直接提交给Executor执行。使用FutureTask实现超时执行的代码如下:

不直接构造Future对象,也可以使用ExecutorService.submit方法来获得Future对象,submit方法即支持以 Callable接口类型,也支持Runnable接口作为参数,具有很大的灵活性。使用示例如下:

转自 http://westyi.iteye.com/blog/714935

Proguard代码混淆/反混淆简介

  • proguard 原理

Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,除了注释外,原来的code 基本都可以看到。为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。 proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆 java 元素名混淆掉。在分析class 的同时,他还有其他两个功能,删除无效代码(Shrinking 收缩),和代码进行优化 (Optimization Options)。
缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。
一, 我们用到反射的地方。
二, 我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。
三, 是我们的 java 元素名称是在配置文件中配置好的。
所以使用proguard时,我们需要有个配置文件告诉 proguard 那些 java 元素是不能混淆的。

继续阅读Proguard代码混淆/反混淆简介

使用Maven构建Struts2项目

1. 新建一个基本的Web项目

这和前面讲的是一样的,可以参考前面的博客

2. 添加Struts2依赖

这里主需要在pom.xml中添加一个struts-core的依赖即可:

之后,Maven会自动从网上下载struts2需要的其他依赖包,可以看一下这里:

1365857845_8824

3. 新建一个Action

struts.xml

web.xml

index.jsp

login.jsp

login_success.jsp

项目结构如下图所示:

1365858256_5114

使用Maven 构建 Servlet的例子

按照前面的 使用Maven构建Web项目 来创建一个Web项目,然后创建下面的例子

1.在src/main/java下,新建一个Servlet

 

2. 修改web.xml

3.修改pom.xml

 

4. 新建JSP

login.jsp

 

5. 测试

1365863970_1170

1365863980_8926

1365863994_9037

项目结构如下图所示:

1365864022_9970

参考

http://blog.csdn.net/yuguiyang1990/article/details/8797153

wordpress代码高亮插件Crayon Syntax Highlighter使用教程

如何安装?

在wp后台安装插件处,搜索Crayon Syntax Highlighter插件,你会看到一个满分的该插件,直接安装即可,wp会帮你下载并解压安装的。

如何设置?

在wp后台右边菜单栏 设置->Crayon 中,又该插件的详细设置选项。不懂的选项大家可以多试试。

如何使用?

使用方法与SyntaxHighlighter 类似,同样是在html编辑模式下,使用该类语言的标签,比如你的代码是C++,

[C++]

your code

[/C++](只是个例子)

代码效果:

相信这种方式还是比较简单吧。

如果你还嫌麻烦,那么请使用可视化模式下的工具吧,安装完Crayon后,可视化编辑第一行菜单最后一个是该插件的选项,你可以点击它,直接拷贝你想高亮的代码进入就可以了,效果如下图所示,可视化编辑,更方便了。

Crayon

参考

http://www.cppfans.org/1224.html

使用Maven构建Web项目

参考 http://blog.csdn.net/yuguiyang1990/article/details/8796410

1.新建Maven项目

1.1 File -> New -> Other

1365863541_5385

1.2 选择Maven Project ,单击Next

1365863553_1351

1.3 保持默认即可,单击Next

1365863566_6467

1.4 选择Archetype为 web app,单击Next

1365863577_7171

1.5 输入一些必要信息,单击Finish

1365863587_8509

1.6 项目结构如下图:

1365863599_9491

或者如下图

在Mac下面的Eclipse Kepler中目录的位置有所变化

screenshot

2.配置项目(某些修改实际工作中用不到,以下仅供参考

现在开始修改一些配置

2.1 在项目上右键单击,添加Source Folder

Maven的项目有一些约定:src/main/java , src/main/resources , src/test/java , src/test/resources .那么,添加这些文件夹:(注意,创建文件夹有可能失败,比如Kepler 上面,此时,到目录下面直接创建文件夹然后刷新Eclipse项目就可以了

1365863613_2412

输入Source Folder 的名字

1365863628_6400

创建完之后的目录结构:

1365863640_6524

2.2 修改Build Path 配置

在项目上,右键单击,选择 Build Path ->Configure Build Path

1365863656_2376

选择 Source标签,会显示4个Source Folder ,修改他们的 OutPut folder :

1365863670_3566

双击每个文件夹的Output folder,选择路径

src/main/java,src/main/resources,选择target /classes;
src/test/java ,src/test/resources, 选择target/test-classes;

1365863682_6273

修改完成后如下图所示:

1365863693_6468

修改JDK版本:选择 libraries 标签,选中JRE library,单击Edit按钮

1365863704_4952

选择系统默认的就可以了,单击 Finish 按钮:

1365863729_2512

最后,单击OK即可:

1365863769_4461

完成后,项目结构如下图:

1365863781_4158

2.3 将项目转换为Dynamic Web Project

在项目上右键单击,选择 Properties:

1365863806_5537

在左侧选择 Project Facets,单击右侧的 ”Convert faceted from “链接:

1365863817_6166

修改Java为你当前项目的JDK,并添加Dynamic Web Module ,最后单击”Further Configuration available“ 链接:

1365863830_6294

修改Content directory 为 src/main/webapp ,单击OK:

1365863840_2584

在一次单击OK,完成操作:

1365863853_7859

2.4 设置部署程序集(Web Deployment Assembly)

在项目上右键单击,选择Properties,在左侧选择Deployment Assembly

1365863864_8268

此处列表是,部署项目时,文件发布的路径。
1,我们删除test的两项,因为test是测试使用,并不需要部署。
2,设置将Maven的jar包发布到lib下。
Add -> Java Build Path Entries -> Maven Dependencies -> Finish
设置完成效果图
1365863878_5803

单击OK

完成后,项目结构如下图所示:

1365863887_1279

就这样,使用Maven构建的一个Web项目就完成了。

Linux SVN提交时强制写日志

SVN默认可以不写注释提交,有时候可能忘记写注释,有的人也没有写注释的习惯,导致翻看history的时候都不知道做了哪些更改,可以依照以下步骤修改SVN配置,强制提交SVN前写注释

步骤:

1.进入svn/code/hooks目录,在svn版本库的hooks文件夹下面,复制模版pre-commit.tmpl

2.编辑pre-commit文件:

上面这几行注释掉(前面加#符号),在此位置添加如下几行:

ubuntu支持exfat分区

对于Ubuntu 14.04.5之前的版本

  1. Add the repository:
  2. Update the package list:
  3. Install the exfat package:

对于Ubuntu 14.04.5以及之后的版本

Eclipse debugger always blocks on ThreadPoolExecutor without any obvious exception

I'm working on my usual projects on Eclipse, it'a a J2EE app, made with Spring, Hibernate and so on. I'm using tomcat7 for this (no particular reason, I don't exploit any new feature, I just wanted to try that). Every time I debug my application, it happens that eclipse debugger pops out like it has reached a breakpoint, but it is not the case, in fact it stops on a Java Source File that is ThreadPoolExecutor. There is no stack trace on the console, it just stops. Then if I click on resume it goes on and the app works perfectly. This is what shows in the debugger window:

Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException))
ThreadPoolExecutor$Worker.run() line: 912
TaskThread(Thread).run() line: 619

I really can't explain this, because I'm not using ThreadPoolExecutor at all. Must be something from Tomcat, Hibernate or spring. It's very annoying because I always have to resume during debugging.

Any clues?

The posted stack trace indicates that a RuntimeException was encountered in a Daemon thread. This is typically uncaught at runtime, unless the original developer caught and handled the exception.

Typically, the debugger in Eclipse is configured to suspend execution at the location where the exception was thrown, on all uncaught exceptions. Note that the exception might be handled later, lower down in the stack frame and might not lead to the thread being terminated. This would be cause of the behavior observed.

Configuring the behavior of Eclipse is straightforward - in the Preferences Dialog, the Debug pane under Java in the tree hierarchy, has the option titled "Suspend execution on uncaught exceptions", which can be unchecked.

Ubuntu 13.10 aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

升级到Ubuntu 13.10 之后 Eclipse 中的Android adb 会报告  Android/android-sdk-linux/build-tools/19.0.0/aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

原因在于,在13.10 版本中,ia32_libs 被废弃了导致没有32位的lib库。

解决方法