java多线程并发解决方案详解(关于java多线程并发控制机制)

http://www.itjxue.com  2023-01-25 01:58  来源:未知  点击次数: 

java 多线程并发怎么实现

public class SayHello(){

public void sayHello(){system.out.println("hello")}

}

public class ThreadA implements Runable{

private SayHello sh;public void run(){

while(true){sh.sayHello();}

}

public void setSayHello(SayHello sh){this.sh=sh}

}

public class ThreadB implements Runable{

private SayHello sh;public void run(){

while(true){sh.sayHello();}

}

public void setSayHello(SayHello sh){this.sh=sh}

}

public Class Test{

public static void main(String[] arg){

SayHello sh=new SayHello():

ThreadA ta=new ThreadA();ta.setSayHello(sh);

ThreadB tb=new ThreadB(); tb.setSayHello(sh);

Thread t=new Thread(ta);

Thread t2=new thread(tb);

t.start();t2.start()

}

}

JAVA怎么处理线程池中线程的并发问题?

可以通过以下原则解决:

1、设置线程池的最大线程数

2、设置线程池的并发处理线程数量

3、设置线程池最大的队列线程数

4、做好线程池的线程清理工作

做好这几点,理论上没问题了,具体还得看编程者代码的质量。

PS:服务器不可能为每一个请求都创建线程,得考虑到最大负载,当达到临界值的时候,服务器返回繁忙状态,拒绝服务即可,当然这是简单的处理办法。

JAVA多线程并发问题

看你的描述,你是使用了类的成员变量,也就是static的静态变量是吧,你得这种情况最好的解决办法就是不用静态变量,改用实例成员变量,这样每一个对象各自都有各自的变量。当然如果你一定要用静态变量,那么你得程序就牵扯到线程安全问题了,你得多个线程,在争夺共有的资源(类静态变量)要么改成单线程,要么变成同步语句块或者同步方法,保证共有资源的锁定和可靠性。

java多线程并发问题怎么解决

java多线程并发问题产生的主要原因是多个线程访问一个实例,导致其中一个线程修改或删除这个实例时,其他线程产生并发问题。

要解决这种并发问题有两种方法:

(1)加上线程锁synchronization

(2)还有个不是办法的办法:不用成员变量,用局部变量

什么是java多线程详解

线程对象是可以产生线程的对象。比如在Java平台中Thread对象,Runnable对象。线程,是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。相比于多进程,多线程的优势有:

(1)进程之间不能共享数据,线程可以;

(2)系统创建进程需要为该进程重新分配系统资源,故创建线程代价比较小;

(3)Java语言内置了多线程功能支持,简化了java多线程编程。

一、创建线程和启动

(1)继承Thread类创建线程类

通过继承Thread类创建线程类的具体步骤和具体代码如下:

? 定义一个继承Thread类的子类,并重写该类的run()方法;

? 创建Thread子类的实例,即创建了线程对象;

? 调用该线程对象的start()方法启动线程。

复制代码

class SomeThead extends Thraad {

public void run() {

//do something here

}

}

public static void main(String[] args){

SomeThread oneThread = new SomeThread();

步骤3:启动线程:

oneThread.start();

}

复制代码

(2)实现Runnable接口创建线程类

通过实现Runnable接口创建线程类的具体步骤和具体代码如下:

? 定义Runnable接口的实现类,并重写该接口的run()方法;

? 创建Runnable实现类的实例,并以此实例作为Thread的target对象,即该Thread对象才是真正的线程对象。

复制代码

class SomeRunnable implements Runnable {

public void run() {

//do something here

}

}

Runnable oneRunnable = new SomeRunnable();

Thread oneThread = new Thread(oneRunnable);

oneThread.start();

复制代码

(3)通过Callable和Future创建线程

通过Callable和Future创建线程的具体步骤和具体代码如下:

? 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

? 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

? 使用FutureTask对象作为Thread对象的target创建并启动新线程。

? 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值其中,Callable接口(也只有一个方法)定义如下:

复制代码

public interface Callable {

V call() throws Exception;

}

步骤1:创建实现Callable接口的类SomeCallable(略);

步骤2:创建一个类对象:

Callable oneCallable = new SomeCallable();

步骤3:由Callable创建一个FutureTask对象:

FutureTask oneTask = new FutureTask(oneCallable);

注释: FutureTask是一个包装器,它通过接受Callable来创建,它同时实现了 Future和Runnable接口。

步骤4:由FutureTask创建一个Thread对象:

Thread oneThread = new Thread(oneTask);

步骤5:启动线程:

oneThread.start();

java多线程并发的问题

回答这个问题需要先弄清楚线程的概念和线程的生命周期。

线程:是指程序代码的一次执行,是动态的过程。楼主在定义OneTh这个实现Runnable接口类的时候肯定复写了他的run()方法。onet1和onet2是两个线程,也就是说虽然他们的run()方法相同,但是是执行了两次的。

计算机中CPU的调度过程:现在的电脑看上去能同时实现多任务,像是一边上QQ,一边听音乐,还可以一边上网。但计算机中的CPU只有一个,它没有分身术,不可能真正意义上实现同时运行这么多程序。而是采用了一种时间片轮转的方式,为每个应用程序赋予极短的时间,然后高速的在不同的程序间切换,至于每次切换到那个程序,这个要由CPU和线程的优先级来决定。

线程的生命周期:创建时是初始化了这个线程,调用start方法时,是让这个线程进入了可运行状态,注意是可运行,不是正在运行。就像上面说的,在某一时刻CPU具体要运行谁是由CPU和线程的优先级决定的。当线程被CPU运行时,就会开始执行run方法,但可能执行到一半时,CPU又被其他可运行线程抢走,而只能暂停执行。

JAVA程序线程的运行:在我们使用java命令来运行程序时,这时候已经开始了两个线程,一个是main()方法的线程,一个是垃圾回收的线程。当楼主调用start方法开启另外两个线程时。这时候由于CPU来决定运行哪个线程。所以虽然noet1是先开启的,但在执行noet1时,CPU可能又去跑去执行main线程了,然后就会开启onet2.

还有我觉得主线程结束了,只不过其他两个线程仍在继续运行。所以会打印出结果。

楼主如果还有什么不明白的话可以继续问或者相互讨论。

(责任编辑:IT教学网)

更多