小程序多线程运行优化(提升小程序的处理能力)
848
2022-10-20
多线程只有在多处理器系统(比如多核、smp等)上才有可能提高执行速率。在多处理系统上,将要执行的任务分割成多个可并行执行线程,就可以提高执行速率。但是如果任务本身不可并行,比如就是一个有限状态自动机的程序,那就没办法用到多处理机,也不能提高速率。上面说的是并行,不是并发。单处理器上多线程只能并发执行而不是并行,多线程并不能提高纯计算程序的速率。但是对于一般程序中都有i/o操作等,可以将io操作放到一个线程中执行,从而可以在io同时进行其他操作不比等待io完成,这样可以提高速率。不宜创建过多线程,因为线程context switch造成很大的cpu负荷,并且线程占用内存资源。现在的网络服务器为了支持大量并发多不是靠多线程或多进程,而采用其他的技术如异步i/o,i/o multiplexing
传统的进程间通信的方式有大致如下几种:
(1) 管道(PIPE)
(2) 命名管道(FIFO)
(3) 信号量(Semphore)
(4) 消息队列(MessageQueue)
(5) 共享内存(SharedMemory)
(6) Socket
Java如何支持进程间通信。我们把Java进程理解为JVM进程。很明显,传统的这些大部分技术是无法被我们的应用程序利用了(这些进程间通信都是靠系统调用来实现的)。但是Java也有很多方法可以进行进程间通信的。
除了上面提到的Socket之外,当然首选的IPC可以使用Rmi,或者Corba也可以。另外Java nio的MappedByteBuffer也可以通过内存映射文件来实现进程间通信(共享内存)。
楼主,这是一个多线程同步问题,我稍微修改了一下程序,仅供参考
PS:四个线程不一定都能抢到CUP时间片,所以有些线程有可能卖不到票。楼主可以多运行几次,会得到不同的运行效果,非常有意思。呵呵。。。
public class TestThread{
public static void main(String[] args){
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
class MyThread extends Thread{
private int t=100;
public void run(){
while(true){
synchronized(this){//因为有多个线程共享属性t,故需要使用到synchronized,进行同步
if(t0) System.out.println(Thread.currentThread().getName()+"卖票"+t--);
else break;//此句是为了防止死循环,当t=0是退出循环
}
}
}
}
1楼的线程类是继承Thread类的 而不是实现Runnable接口的 所以在主方法中 没有必要在new Thread(); 占内存
这是一个多线程的程序 只运行1次是看不出来的 以下是修改了下1楼的代码 如果想看明白多线程是怎么输出的 把我引掉的代码打开
public class MyThreadClass { // 入口主类
public static void main(String[] args) {
// for(int i=0;i10;i++){
PrintThread printThread = new PrintThread(); // 打印线程对象
Access_Database access_databaseThread = new Access_Database();
Draw_Picture_On_Screen draw_picture_on_screenThread = new Draw_Picture_On_Screen();
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
printThread.start();
access_databaseThread.start();
draw_picture_on_screenThread.start();
// System.out.println();
// }
}
}
class PrintThread extends Thread {
public void run() {
System.out.println("printing_a_file");
}
}
class Access_Database extends Thread {
public void run() {
System.out.println("accessing_database");
}
}
class Draw_Picture_On_Screen extends Thread {
public void run() {
System.out.println("drawing_picture_on_screen");
}
}
另外,虚机团上产品团购,超级便宜
public class StartDi implements Runnable{
Sound s;
public StartDi(Sound s){
this.s=s;
}
public void run(){
s.ding();
}
}
public class StartDo implements Runnable{
Sound s;
public StartDo(Sound s){
this.s=s;
}
public void run(){
s.dong();
}
}
这两个子类的run方法都是只执行一次而已啊。
你可以改为
public class StartDi implements Runnable{
Sound s;
public StartDi(Sound s){
this.s=s;
}
public void run(){
while(true){
s.ding();
}
}
}
public class StartDo implements Runnable{
Sound s;
public StartDo(Sound s){
this.s=s;
}
public void run(){
while(true){
s.dong();
}
}
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~