我正在这里寻找一些意见。我有一个单例类,其中包含一个值,该值由该类中的方法每隔几秒更新一次。现在,跨多个线程访问该值是通过同步完成的,我想消除同步。这有意义吗?
class DataSegment {
private MetricsUpdater metrics = new MetricsUpdater.getInstance();
public String printValues() {
StringBuilder sb = new StringBuilder();
sb.append(value1);
sb.append(morevalues);
sb.append(metrics.myValue); // this is the value that's currently synchronized
return sb.toString();
}
}
class MetricsUpdater {
private String myValueSynchronized;
public String myValue;
public static MetricsUpdater getInstance() {
if (theInstance == null) {
theInstance = new MetricsUpdater();
}
return theInstance;
}
// this runs on a timer but to keep it simple I'll just define the method...
private void updateMetrics() …Run Code Online (Sandbox Code Playgroud) 我有一些奇怪的问题.
我们正在使用Xvfb虚拟桌面管理器,并希望在继续之前确保它正在运行.使用纯shell,我可以轻松地做到这一点:
ps -ef | grep Xvfb | grep -v grep
Run Code Online (Sandbox Code Playgroud)
而这正是我所需要的,一行包含有关Xvfb proc的信息.接下来,我想将它合并到我的Java程序中并解析结果并存储正在运行的Xvfb进程的PID.所以我想这个:
String line;
try {
Process p = Runtime.getRuntime().exec("ps -ef | grep Xvfb | grep -v grep");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null)
{
System.out.println(line);
}
} catch (Exception err) {
System.out.println(err);
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我使用"ps -ef",当我运行我的应用程序时,我会获得一个大量的进程转储到我的控制台.但是,如果我使用| grep缩小返回的进程列表,我得到零结果.input.readLine()每次都为null.
我也尝试过:
ps -ef | grep Xvfb | grep -v grep | awk {'print $2'}
Run Code Online (Sandbox Code Playgroud)
要抓住进程ID.而且,没有运气.
有没有其他人经历过这个或知道我做错了什么?
所以我继承了一些等待来自网络源的通信的代码.
当它正在等待来自网络套接字的更多数据时,会Thread.sleep(10)被调用.这似乎导致了线程泄漏,正如jconsole和我的线程转储所报告的那样(Thread-68,Thread-385等有数百个条目......但为了简洁我缩短了):
Wed Jan 18 09:14:40 PST 2012
2012-01-18 09:14:50
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode):
"Thread-69" daemon prio=10 tid=0x00007f01a047c800 nid=0x3725 waiting on condition [0x00007f019eaf4000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.unitt.framework.websocket.simple.NetworkSocket.run(NetworkSocket.java:304)
at java.lang.Thread.run(Thread.java:662)
"Thread-68" daemon prio=10 tid=0x00007f01a0500000 nid=0x371c waiting on condition [0x00007f019ecf6000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.unitt.framework.websocket.simple.NetworkSocket.run(NetworkSocket.java:304)
at java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)
有问题的代码:
public class NetworkSocket implements NetworkSocketFacade, Runnable
{
... removed many irrelevant methods
public void run()
{
byte[] readBuffer …Run Code Online (Sandbox Code Playgroud) 对Java来说还是比较新的,我想知道哪个是更好的方法来处理这个问题.我有一个类构造函数,它接受一些参数,在这个类中也是公共getter和setter:
private String name;
private Float value;
public MySampleClass(String theName, Float theValue) {
setName(theName);
setValue(theValue);
}
public void setName(String n) {
this.name = n;
}
public value setValue(Float v) {
this.value = v;
}
Run Code Online (Sandbox Code Playgroud)
我想对这个Float做一些检查.它似乎是最好的地方,它将在setter中:
public value setValue(Float v) {
if (v < 0.0f) {
this.value = 0.0f;
} else if (v > 1.0f) {
this.value = 1.0f;
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码最初在构造函数中检查了边界,并在setter中再次检查,这似乎是多余的.我更改了构造函数以调用setter并将检查放在那里.那更有意义吗?或者我违反了一些我完全不知道的惯例?
让我先说一下我是Ant的新手.就像在,我刚开始学习它2天前,以完成这项任务.
我要做的是创建一个"主"ant脚本,调用其他几个ant脚本.例如:
Project A
- contains build.xml, target "makeProjectAjar"
- output: A.jar
Project B
- contains build.xml, target "makeProjectBjar"
- output: B.jar
Project C
- contains build.xml, target "makeProjectCjar"
- output: C.jar
Project D
- contains build.xml, target "finalPackage"
- Must first build Project A, Project B, Project C
- Copy A.jar, B.jar, C.jar to Project D
- Package all of this into D.jar
Run Code Online (Sandbox Code Playgroud)
现在我已经为A,B和C工作了所有的个人构建.通过这个,我的意思是我可以从任何这些文件夹中运行'ant',它将构建项目并生成一个jar文件.如果我用这种方式构建A,B和C,我有3个jar文件.然后我可以将它们复制到D中并将其打包到最终的jar中.这很好.
但我想要的是能够从Project D的build.xml中触发A,B和C构建.我试过这个:
<?xml version="1.0" encoding="UTF-8"?>
<project name="CommonJava" default="makeCommonJavaJar" basedir=".">
<import file="../Common/build.xml"/>
<import file="../CommonAndroid/build.xml"/>
<target name="makeCommonJavaJar" …Run Code Online (Sandbox Code Playgroud) 我有一个扩展org.apache.ant.tools.Task的类.这个类有5个变量,通过公共setter设置:
private String server;
private String username;
private String password;
private String appname;
private String version;
private String file;
Run Code Online (Sandbox Code Playgroud)
然后有一个公共的execute()方法,由ant调用:
public void execute() throws BuildException {
checkArgs()
... // my execute code goes here
}
Run Code Online (Sandbox Code Playgroud)
在执行运行之前,我想检查我所需的所有变量都不是null,如果是这样,抛出描述问题的BuildException(),所以回到ant的用户知道出了什么问题:
private void checkArgs() {
if (server == null) {
throw new BuildException("server cannot be null.");
}
if (username == null) {
throw new BuildException("username cannot be null.");
}
if (password == null) {
throw new BuildException("password cannot be null.");
}
if (file == null) …Run Code Online (Sandbox Code Playgroud) 我知道有很多其他人在忘记签名他们的apk时遇到INSTALL_PARSE_FAILED_NO_CERTIFICATES错误.这不是我所描述的问题.我将在几个步骤中详述我正在做的事情.
我有一个zipaligned,签名的apk文件(AndroidWorld.apk).我可以安装这个没问题.到现在为止还挺好.
接下来,我用apktool反编译apk.此外,到目前为止一切顺利.
之后,我使用asmdex来修改classes.dex文件并注入一些方法记录.此时,如果我要重新打包apk并尝试安装,它肯定会失败,因为classes.dex的签名不再匹配签名清单中的内容.我意识到了.所以我重新打包apk,zipalign它,然后用我自己的密钥库签名:
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore "android_new_sample.keystore" -storepass mypass "C:\apk\AndroidWorld-release.apk" asample
Signing with keystore android_sample.keystore alias asample
adding: META-INF/MANIFEST.MF
adding: META-INF/ASAMPLE.SF
adding: META-INF/ASAMPLE.RSA
signing: assets/x.js
signing: assets/x.css
signing: assets/special_offers.html
signing: res/layout/displayjourneylist.xml
signing: res/layout/journey_row.xml
signing: res/layout/login.xml
signing: res/layout/searchjourney.xml
signing: res/layout/settings.xml
signing: res/layout/webview.xml
signing: res/layout/window_title.xml
signing: res/menu/option_menu.xml
signing: AndroidManifest.xml
signing: resources.arsc
signing: res/drawable-hdpi/header.png
signing: res/drawable-hdpi/ic_launcher.png
signing: res/drawable-ldpi/header.png
signing: res/drawable-ldpi/ic_launcher.png
signing: res/drawable-mdpi/header.png
signing: res/drawable-mdpi/ic_launcher.png
signing: classes.dex
signing: assets/x-runtime.properties
1 file(s) copied.
Run Code Online (Sandbox Code Playgroud)
那里没有投诉,对吧?它看起来像classes.dex已签署,它没有抱怨.但是现在,如果我用jarsigner -verify检查签名apk的完整性,那就不开心了:
jarsigner.exe -verify -verbose -certs C:\apk\AndroidWorld-release-signed.apk …Run Code Online (Sandbox Code Playgroud) 我有两个非常相似的Android布局:
default_spinner.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/settings_line_min_height"
android:orientation="horizontal"
android:paddingLeft="@dimen/common_padding"
android:paddingRight="@dimen/common_padding">
<TextView
android:id="@id/label"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1" />
<ImageButton
android:id="@+id/down_spinner_btn"
style="@style/SpinnerDownButton"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
<EditText
android:id="@+id/edit_box"
style="@style/EditableSpinnerText"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:inputType="number"
android:imeOptions="actionDone"
android:longClickable="false" />
<ImageButton
android:id="@+id/up_spinner_btn"
style="@style/SpinnerUpButton"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
和
custom_spinner.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="@dimen/common_padding"
android:paddingRight="@dimen/common_padding">
<TextView
android:id="@id/label"
style="@style/Subhead.Translucent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1" />
<ImageButton
android:id="@+id/down_spinner_btn"
style="@style/SpinnerDownButton"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
<com.company.CustomEditText
android:id="@+id/edit_box"
style="@style/EditableSpinnerText"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:inputType="text" />
<ImageButton
android:id="@+id/up_spinner_btn"
style="@style/SpinnerUpButton" …Run Code Online (Sandbox Code Playgroud) 我正在学习lambdas,我想知道以下代码:
ArrayList<String> lines = new ArrayList<>();
lines.add("#ignored");
lines.add(" #ignored2");
lines.add("Not Ignored");
lines.add("also not ignored");
lines.add(" also Not Ignored but lower CASE");
lines.stream()
.filter(line -> !line.trim().startsWith("#"))
.map(line -> line.trim().toLowerCase())
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
输出:
not ignored
also not ignored
also not ignored but lower case
Run Code Online (Sandbox Code Playgroud)
对于过滤器和地图线,我正在调用trim()去除任何前导或拖尾空格.
这里是否可以修剪一次,存储结果,然后在地图中使用该结果?
java ×8
android ×2
ant ×1
build ×1
coding-style ×1
constructor ×1
grep ×1
jar-signing ×1
lambda ×1
linux ×1
memory-leaks ×1
process ×1
sleep ×1
target ×1
thread-sleep ×1
unix ×1
validation ×1
variables ×1