如何在Macintosh平台上用Java更改程序的Dock图标?我听说过使用Apple的Java库(在Mac平台上提供某种额外的支持),但我还没有找到一些实际的例子.
我正在编写多人游戏的服务器端网络.该游戏是一款RPG,它拥有2000名玩家的绝对最大容量,但它实际上最多可以达到300名玩家,尽管它可能更高或更低.时间最长的,每次我不得不这样做网络它涉及大量客户端的时候,我一直坚持着NIO,因为它并不需要使用数百个线程的.最近,我遇到了一个PowerPoint演示文稿,它详细描述了这两个模型,它几乎使得每个客户端的模型看起来优于NIO.我还发现了一些地方,它表明老IO实际上也可以超越NIO.
PowerPoint可以在这里找到(它有点旧):http://www.mailinator.com/tymaPaulMultithreaded.pdf.
我还没有写任何内容,所以如果我不得不改变整个网络设计,那么从一开始就不会有问题.我没有时间压力.最初,我正在使用NIO设计反应器模式实现(选择一个事件,调度一个处理事件的处理程序).
更多信息可以在这里找到:http://en.wikipedia.org/wiki/Reactor_pattern
我的整个reactor实现旨在使用单个线程.由于我读到旧的IO可以超越,它实际上让我处于两难境地.我并不想设计一个使用多线程只是把所有的CPU功率的充分利用复杂的NIO系统,但我也畏缩在具有单一的应用程序中使用线程300+的想法.哪种设计适合我的目的?每个客户端的线程优势在于它本质上真正使用了所有CPU功能,但同时也使系统陷入困境.更不用说,单个线程的堆栈大小占用了大量内存(乘以几百倍).我应该坚持反应堆模式吗?
我知道这个问题是有点暧昧,但我觉得我需要特别提出一个问题,我的情况,因为我无法找到这个网站,也不是一个网站,它解决了我的排序问题的问题.有一个关于游戏,但该游戏旨在处理成千上万的玩家.
非常感谢!如果您需要任何澄清,请询问!
考虑这两种方法:
public static void forLoop(int start, int limit) {
for (int i = start; i < limit; i++) {
}
}
public static void whileLoop(int start, int limit) {
int i = start;
while (i < limit) {
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
编译时,它们会产生字节码(这是详细的输出javap
):
public static void forLoop(int, int);
descriptor: (II)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=2
0: iload_0
1: istore_2
2: iload_2
3: iload_1
4: if_icmpge 13
7: iinc 2, 1
10: goto 2
13: return
LineNumberTable:
line …
Run Code Online (Sandbox Code Playgroud) NIO和TCP为很多连接做出了很好的配对.由于需要为每个新客户端打开一个新连接,因此每个客户端通常都需要自己的线程来阻止I/O操作.NIO通过允许在可能的情况下读取数据来解决该问题,而不是在可用之前阻塞.但是UDP怎么样?
我的意思是,无连接UDP不具有与之关联的TCP的阻塞性质,因为协议的设计方式(基本上是发送并忘记它).如果我决定将某些数据发送到某个地址,那么它会这样做,没有延迟(在服务器端).同样,如果我想读取数据,我只能接收来自不同来源的单个数据包.我不需要与许多地方有很多连接,使用许多线程来处理它们中的每一个.
那么,NIO和选择器如何增强UDP?更具体地说,什么时候人们更愿意使用UDP与NIO而不是ol' java.net
包?
最近我一直在学习如何编程C.在大多数情况下,我一直在使用Eclipse的C版本.最近,我尝试了Xcode.我正在使用运行Mac OS X Lion的Mac - Xcode 4.1版.
我有一个不满:在我创建的每个文件的顶部,有一小部分评论我希望删除或更好,更改.
当我创建一个文件时,默认情况下这样的东西放在文件的顶部:
//
// FILE.c
// PROJECT NAME
//
// Created by Martin Tuskevicius on DATE.
// Copyright YEAR ORGANIZATION (my school name for some reason). All rights reserved.
//
Run Code Online (Sandbox Code Playgroud)
显然,首都的东西将被实际价值取代.对于那些已经使用或已经使用Xcode进行编程C的人 - 你知道如何更改或删除这些默认注释的方法吗?
我非常感谢任何帮助.谢谢!
我有一个快速而简单的问题.我习惯于让每个班级都"最后",除非当然,它需要由另一个班级延长.
这是一个坏习惯吗?一个好习惯?它甚至重要吗?我理解修饰符对类的影响.
非常感谢提前!
编辑:这是一个示例代码.任何其他类都不会扩展此类.
public final class Application {
/**
* Starts the application.
*
* @param arguments arguments provided from command-line
*/
public static void main(String[] arguments) {
LaunchUtilities util = new LaunchUtilities(new EventHandler());
try {
util.addListener(43594);
} catch (IOException ioe) {
Logger.getLogger(Application.class.getName()).log(Level.SEVERE, "Could not bind a port to a listener!", ioe);
}
util.start();
}
}
Run Code Online (Sandbox Code Playgroud) 最近,我正在编写一个类,我决定将其作为包私有(即没有访问修饰符或默认修饰符).它有一个内部类和一些private
辅助方法,以及一个旨在由同一个包中的类使用的方法.所有这些班级成员都是static
.但后来我有一个想法:这个方法应该有public
访问修饰符还是没有访问修饰符,比如包含它的类?
一方面,由于类本身是包私有的,因此只能在其包中访问和使用它,因此没有实际的理由来制作该方法public
.但同时,在语义上,此方法旨在成为类的公共特性,即,旨在外部使用的类的特性,因此修改其访问权限是有意义的.
对于那些喜欢看代码的人,
final class DummyRemover {
private DummyRemover() {
}
public static int remove(Map<String, ClassNode> classMap) {
return 0;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
要么,
final class DummyRemover {
private DummyRemover() {
}
// Notice the modifier.
static int remove(Map<String, ClassNode> classMap) {
return 0;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
这里最好的选择是什么?是否有一个经验法则来决定在这种情况下使用哪些访问修饰符?
我正在编写一个小应用程序,当我尝试创建一个ImageIcon时,我总是遇到异常.这个例外代码引起了异常:
prayerLevel.setIcon(new ImageIcon(getClass().getResource("/icons/icon_prayer.png")));
Run Code Online (Sandbox Code Playgroud)
现在在我的程序中,文件夹/ icons /确实存在.我不知道它是否有所不同但是类文件在一个包中,其中icons文件夹在项目文件夹中(当你看到bin和src文件夹时).
我已经四处寻找,我找不到可以帮助我解决问题的解决方案.也许你们中的任何人都可以帮忙吗?
编辑:有人要求我的文件夹层次结构:
我知道类文件与图标不在同一个文件夹中,但我已经创建了应用程序,我必须从不同的文件夹加载文件并执行/文件夹/始终用于工作.
编辑2:
System.out.println(getClass().getResource("/icons/icon_prayer.png") == null);
Run Code Online (Sandbox Code Playgroud)
打印真实.
我正在编写一个应用程序,它涉及将相当大的数据块写入OutputStream(属于Socket).使这有点复杂的是,通常有多个线程试图写入同一个OutputStream.目前,我设计它使得要写入数据的OutputStream在它自己的线程中.该线程包含一个队列(LinkedList),它轮询字节数组并尽快写入它们.
private class OutputStreamWriter implements Runnable {
private final LinkedList<byte[]> chunkQueue = new LinkedList<byte[]>();
public void run() {
OutputStream outputStream = User.this.outputStream;
while (true) {
try {
if (chunkQueue.isEmpty()) {
Thread.sleep(100);
continue;
}
outputStream.write(chunkQueue.poll());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这种设计的问题在于,随着越来越多的写入发生,越来越多的数据排队,并且不会更快地写入.最初,当数据被放入队列时,它几乎立即被写入.然后大约15秒后,数据开始落后; 从数据排队的时间到实际写入数据的时间延迟.随着时间的推移,这种延迟变得越来越长.这是非常明显的.
解决这个问题的一种方法是使用某种ConcurrentOutputStream实现,它允许在不阻塞的情况下发送数据,这样就不会开始备份写入(哎呀,队列就没必要了).我不知道是否有这样的实现 - 我一直找不到 - 我个人认为甚至不可能写一个.
那么,有没有人对我如何重新设计这个有什么建议?
考虑一下Netty教程中的以下示例(尽管这不是我见过的唯一示例):
Executor bossPool = Executors.newCachedThreadPool();
Executor workerPool = Executors.newCachedThreadPool();
ChannelFactory channelFactory = new NioClientSocketChannelFactory(bossPool, workerPool);
Run Code Online (Sandbox Code Playgroud)
在这里创建两个单独的缓存线程池。但为什么?如果多个线程池的大小固定,我可以理解它们的用途,但是高速缓存的线程池不是。那么,如果只拥有一个不断扩展的缓存池,为什么还要拥有多个缓存的线程池呢?实际上,只拥有一个不是更好吗?因为如果您有两个不同的线程提交任务,那么这意味着更可能利用空闲的工作线程。
我对此很疑惑,因为我正在为服务器编写网络,并且正在分别处理UDP和TCP连接。我想将处理任务分派到线程池,并且我正在考虑为此使用缓存的线程池。但是,我不知道该使用一两个。
谢谢。
java ×9
macos ×2
networking ×2
nio ×2
c ×1
class ×1
classpath ×1
comments ×1
decompiling ×1
dock ×1
extend ×1
final ×1
icons ×1
outputstream ×1
queue ×1
sockets ×1
tcp ×1
threadpool ×1
udp ×1
xcode ×1