Java 执行多线程的另一种方法,而不是使用静态方法和变量
我正在编写一个启动1000个线程的程序,每个线程向一个变量和加1。代码如下:Java 执行多线程的另一种方法,而不是使用静态方法和变量,java,multithreading,Java,Multithreading,我正在编写一个启动1000个线程的程序,每个线程向一个变量和加1。代码如下: public class Test1 implements Runnable{ public Test1( ) { } public void run() { Sum.sum++; } public static void main(String[] args) { //Sum s = new Sum(); for (int i
public class Test1 implements Runnable{
public Test1( ) {
}
public void run() {
Sum.sum++;
}
public static void main(String[] args) {
//Sum s = new Sum();
for (int i = 0; i < 1000; i++) {
Thread t = new Thread(new Test1());
try {
t.start();
t.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Sum.getSum());
}
}
public class Sum {
static int sum;
public Sum() {
sum = 0;
}
public static int getSum() {
return sum;
}
public static void setSum(int sum) {
sum = sum;
}
}
public类Test1实现可运行{
公共测试1(){
}
公开募捐{
Sum.Sum++;
}
公共静态void main(字符串[]args){
//Sum s=新的Sum();
对于(int i=0;i<1000;i++){
线程t=新线程(新Test1());
试一试{
t、 start();
t、 睡眠(1);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
System.out.println(Sum.getSum());
}
}
公共类金额{
静态整数和;
公帑(){
总和=0;
}
公共静态int getSum(){
回报金额;
}
公共静态无效设置总和(整数和){
总和=总和;
}
}
有没有一种方法可以创建Sum类的实例,然后每个线程向Sum类的同一实例添加1?我的意思是不使用静态方法或变量。公共类Test1实现Runnable{
public class Test1 implements Runnable{
Sum s = null;
public Test1(Sum s) {
this.s = s;
}
public void run() {
s.sum++;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Sum s = new Sum();
for (int i = 0; i < 1000; i++) {
Thread t = new Thread(new Test1(s));
t.start();
}
System.out.println(s.getSum());
}
}
class Sum {
int sum;
public Sum() {
sum = 0;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
sum = sum;
}
总和s=零;
公共测试1(总和s){
这个.s=s;
}
公开募捐{
s、 sum++;
试一试{
睡眠(1);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
Sum s=新的Sum();
对于(int i=0;i<1000;i++){
线程t=新线程(新测试1);
t、 start();
}
System.out.println(s.getSum());
}
}
班级总数{
整数和;
公帑(){
总和=0;
}
公共整数getSum(){
回报金额;
}
公共无效设置总和(整数和){
总和=总和;
}
}
重要注意事项:
1-sleep()是静态的,因此它作用于当前正在运行的线程,因此,如果您想使线程t休眠,正确的方法如下所示
2-System.out.println(s.getSum());不保证在所有线程完成后运行。。。。如果要这样做,请使用ExecutorService
3-执行synchronized add()方法,而不是直接访问变量。。。。在这里,这并不重要,但在现实生活中的例子中,您可能会遇到竞争条件事实上我以前也做过同样的事情,但它不会为每个线程创建一个新的Sum实例吗?或者我搞错了?不,因为所有人都在处理同一个对象的。。。。。。。。如果你说public void run(){Sum s=new Sum();s.Sum++;},它会在每个线程中创建一个新实例,这个答案是错误的。如果没有你提到的同步,行为是不可预测的。我只是做了最小的更改来满足需要,但肯定。。。。同步应该像我提到的那样使用。。。但是由于逻辑“here”非常简单,没有并发读写,甚至没有处理,只有单个变量的简单增量。。。。我无法想象你将
s
声明为局部变量的不可预测结果的逻辑。它超出了运行
的范围。2) 如果您想让它成为一个实例字段,那么您没有回答要求所有线程共享一个和的问题。3) 如果您让所有线程共享一个Sum
,那么如果没有同步,一切都会失败。