小编AWT*_*AWT的帖子

跨多个线程访问字符串

我正在这里寻找一些意见。我有一个单例类,其中包含一个值,该值由该类中的方法每隔几秒更新一次。现在,跨多个线程访问该值是通过同步完成的,我想消除同步。这有意义吗?

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)

java multithreading synchronization

5
推荐指数
1
解决办法
3868
查看次数

Java - 如何检查Linux上是否正在运行另一个(非Java)进程

我有一些奇怪的问题.

我们正在使用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.而且,没有运气.

有没有其他人经历过这个或知道我做错了什么?

java unix linux grep process

4
推荐指数
1
解决办法
7808
查看次数

Java Thread.sleep泄漏线程?

所以我继承了一些等待来自网络源的通信的代码.

当它正在等待来自网络套接字的更多数据时,会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 memory-leaks sleep thread-sleep

4
推荐指数
2
解决办法
5215
查看次数

最合适的边界检查 - 构造函数或setter?

对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并将检查放在那里.那更有意义吗?或者我违反了一些我完全不知道的惯例?

java constructor coding-style getter-setter

3
推荐指数
1
解决办法
318
查看次数

使用Ant构建其他依赖项目

让我先说一下我是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)

java ant build target

3
推荐指数
1
解决办法
7688
查看次数

如何在继续之前检查一组变量是否为null

我有一个扩展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)

java variables validation

3
推荐指数
1
解决办法
73
查看次数

INSTALL_PARSE_FAILED_NO_CERTIFICATES安装修改后的apk文件失败(无效的SHA1签名),即使在使用jarsigner签名后也是如此

我知道有很多其他人在忘记签名他们的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)

java android jar-signing android-keystore

2
推荐指数
1
解决办法
3772
查看次数

是否可以重用Android布局的外部元素?

我有两个非常相似的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)

android android-layout

2
推荐指数
1
解决办法
276
查看次数

Java lambda过滤器和映射,我可以避免这些重复调用吗?

我正在学习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 lambda

1
推荐指数
1
解决办法
100
查看次数