在《Java 并发实践》一书中,作者写道:
当锁定发生争用时,失败的线程必须阻塞。JVM 可以通过自旋等待(反复尝试获取锁直到成功)或通过操作系统挂起被阻塞的线程来实现阻塞。哪个更高效取决于上下文切换开销和锁变得可用之前的时间之间的关系;对于短时间的等待,首选旋转等待,而对于长时间的等待,首选暂停。一些 JVM根据过去等待时间的分析数据在两者之间进行自适应选择,但大多数只是挂起等待锁的线程。
当我读到这篇文章时,我感到非常惊讶。是否有任何已知的 JVM 在始终旋转等待或有时由于分析结果而导致旋转等待时实现阻塞?现在很难相信。
有人告诉我Thread.Sleep(),有时候使用是一个糟糕的解决方案,人们会希望在同步方法的一个动作循环中产生一些时间间隔.
另一方面,我有两个不同的线程,它们在我的程序的运行时间和一个共享对象中都是活动的,当我在该共享对象中使用Object.wait(long)时,它会导致我的GUI冻结一段时间.
什么是这个问题的更好的解决方案?
更新此部分代码包含一个以GUI开头的线程:
class temperatureUp extends Thread
{
@Override
public void run()
{
while(true)
{
try
{
GBC.increaseTemp();
updateSystemStatus();
}
catch(Exception ex)
{
StringWriter w = new StringWriter();
ex.printStackTrace(new PrintWriter(w));
txtLog.setText(w + "\n" + txtLog.getText());
}
}
}
};Run Code Online (Sandbox Code Playgroud)
这是共享对象中的同步方法,GBC:
public synchronized void increaseTemp() throws InterruptedException{
// don't increase the temperature if the boiler
// is not turned on...
while (!isBoilerOn)
wait();
// increase the current temperature
if ((currentTemp + 1) < MAX_TEMP && currentTemp < desiredTemp) …Run Code Online (Sandbox Code Playgroud) 我通过反射创建我的枚举,因为我为每个枚举添加了一个实现抽象工厂的内部类.现在我想访问这个内部类以调用该方法:
@Factory(FooFactory.class)
public enum Foo {
FOO, BAR;
public class FooFactory implements AbstractFactory<Foo> {
public Foo create(String value) {
return valueOf(value.toUpperCase());
}
}
}
Run Code Online (Sandbox Code Playgroud)
定义@Factory是:
@Retention(RetentionPolicy.RUNTIME)
public @interface Factory {
Class<?> value();
}
Run Code Online (Sandbox Code Playgroud)
但是,有了这个,我收到以下错误:
无法将类解析为类型FooFactory.java
当我尝试时@Factory(Foo$FooFactory.class)收到错误:
无法使用其二进制名称引用嵌套的Foo $ FooFactory.
那么甚至可以引用嵌套类吗?
我创建了一个HashMap对象,它将String作为键存储,相应的值作为int存储.现在我希望有一个优先级队列,其中包含HashMap对象中存在的所有字符串,其值为作为分配优先级的参考.我写了以下代码
public class URIQueue {
private HashMap<String,Integer> CopyQURI;
private PriorityQueue<String> QURI;
public class TComparator<String> {
public int compareTo(String s1, String s2) {
if (CopyQURI.get(s2) - CopyQURI.get(s1) >= 0) {
return 1;
} else {
return 0;
}
}
}
public URIQueue() {
CopyQURI=new HashMap<>(100);
TComparator<String> tc=new TComparator<>();
QURI=new PriorityQueue<>(100, tc); //Line x
}
}
Run Code Online (Sandbox Code Playgroud)
第x行显示错误无法推断优先级队列的类型参数.请指导我做了什么错误.
我做了以下观察:
$ xclip text.txt
Run Code Online (Sandbox Code Playgroud)
执行立即终止,它将内容复制text.txt到默认选择XA_PRIMARY,这意味着您可以通过鼠标中键或xclip -o.
当我想看看xclip正在做什么时,它不会再终止:
$ xclip -verbose text.txt
Connected to X server.
Using UTF8_STRING.
Reading text.txt...
Waiting for selection requests, Control-C to quit
Waiting for selection request number 1
Run Code Online (Sandbox Code Playgroud)
它直到我在我的X11系统中选择了某些东西才终止,例如我在这里粘贴的这个输出.如果行为仅限于此,我会理解这一点verbose.毕竟你想坐下来看看会发生什么.
我可以重现相同的行为strace,但仅当提供了fork选项时
$ strace -f xclip text.txt
Run Code Online (Sandbox Code Playgroud)
或者,当使用应该返回输出的系统执行命令从Ruby中弹出时,实际上什么都没有.
$ ruby -e "`xclip text.txt`"
Run Code Online (Sandbox Code Playgroud)
给出的提示strace是,它在文件描述符上轮询以等待事件.如果我选择了某些内容,则会满足此事件 这种行为可以解释吗?我有证据表明,这在任何系统上都不可重现.这可能与票证#9没有关闭stdout从stdin设置剪贴板?
我xclip在Ubuntu 13.04上运行版本0.12.
我现在使用protobuf有几个星期了,但是在Java中解析 protobuf 消息时仍然不断遇到异常。
我使用C++创建 protobuf 消息,并使用boost 套接字将它们发送到 Java 客户端正在侦听的服务器套接字。传输消息的C++代码是这样的:
boost::asio::streambuf b;
std::ostream os(&b);
ZeroCopyOutputStream *raw_output = new OstreamOutputStream(&os);
CodedOutputStream *coded_output = new CodedOutputStream(raw_output);
coded_output->WriteVarint32(agentMessage.ByteSize());
agentMessage.SerializeToCodedStream(coded_output);
delete coded_output;
delete raw_output;
boost::system::error_code ignored_error;
boost::asio::async_write(socket, b.data(), boost::bind(
&MessageService::handle_write, this,
boost::asio::placeholders::error));
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我写的是WriteVarint32消息的长度,因此 Java 端应该通过使用parseDelimitedFrom它应该读取多远来知道:
AgentMessage agentMessage = AgentMessageProtos.AgentMessage
.parseDelimitedFrom(socket.getInputStream());
Run Code Online (Sandbox Code Playgroud)
但这没有帮助,我不断收到这些异常:
Protocol message contained an invalid tag (zero).
Message missing required fields: ...
Protocol message tag had invalid wire type.
Protocol message end-group tag …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个属于我自己的新项目:我想编写一个课程安排程序,找出一个课程安排,并为课程和时间分配最佳课程.问题是解决约束,例如:空间和时间没有重叠,没有讲师同时教授多门课程,特定课程的特征要求等.
我期待着编写两个或三个组件架构:
基本上,Web界面接受用户请求,例如输入数据,请求课程安排程序,课程安排程序将加载一组课程和资源,并尝试找出最佳课程分配.
为什么我要使用函数式编程语言?因为我认为他们最好用很少的代码行来检查约束.
所以我的问题是:
1)考虑前端,使用Erlang或Haskell会更容易吗?我已经阅读了一些关于Erlang与Haskell的博客片段,但这并没有多大帮助.有没有人对这个特殊项目有任何意见?
2)您认为使用数据库来共享数据是否有用?我担心ER和 Erlang/Haskell中使用的类型之间的映射.与面向对象语言中使用的ORM范例相比,是否存在更好的存储数据的方式,或者它对我来说会更容易吗?
如果我想使用字节码检测实现分析器,我应该使用JVMTI编写本机代理还是应该使用该包编写java代理?java.lang.instrument
如果我想使用像ASM这样的库- 如果你想创建一个严肃的探查器似乎是强制性的 - 我必须使用java代理.这使我感到困惑,因为我认为本机代理可以完成Java代理可以做的所有事情.但对我来说,编写java代理似乎更容易.
还有替代品吗?是否应该使用java代理和本地代理组合?
使用JavaScript(CoffeeScript)来实现繁重的计算任务有多糟糕?我关注的是一个优化问题,其中无法快速计算出最优解.
首先选择JavaScript,因为可视化是必需的,而不是为不同进程之间的通信添加开销,而是决定在JavaScript中实现所有内容.
我没有看到这个问题,尤其是在查看基准游戏时.但我经常会收到这样一个问题:为什么地球上有JavaScript?
我会用以下方式争论:这是一个优化问题,NP-hard.它并没有多么快很多其他语言会是这样,因为这只是增加了一个常数因子的运行时间-是真的吗?
什么是合适的名字?我读通知/等待几乎不用于其他任何东西,但建立条件队列.另一个可能的名称可能是线程协调.在Java并发教程中,它名为Guarded Blocks.实际上我发现这些都不合适.是否有更好的关键字来描述这种机制?
java ×6
concurrency ×2
annotations ×1
c++ ×1
erlang ×1
haskell ×1
javascript ×1
jframe ×1
jvmti ×1
linux ×1
performance ×1
reflection ×1
scheduling ×1
sockets ×1
swing ×1
tcp ×1
thread-sleep ×1
ubuntu ×1
unix ×1
x11 ×1
xclip ×1