Java中的多线程错误

Java中的多线程错误,java,multithreading,Java,Multithreading,我实现了一个简单的线程程序,其中一个线程将元素推入堆栈,另一个线程从堆栈中弹出元素。我得到了一个意外的输出,其中thread1两次推送一个元素 import java.io.*; import java.lang.*; import java.util.*; public class Threading_Sample implements Runnable { private Thread T1,T2; String ThreadName=""; Stack<I

我实现了一个简单的线程程序,其中一个线程将元素推入堆栈,另一个线程从堆栈中弹出元素。我得到了一个意外的输出,其中thread1两次推送一个元素

import java.io.*;
import java.lang.*;
import java.util.*;

public class Threading_Sample implements Runnable
{
    private Thread T1,T2;
    String ThreadName="";

    Stack<Integer> Stack1=new Stack<Integer>();


    public void Push_Element_to_Stack(int element)
    {
        Stack1.push(element);
    }

    public void Pop_Element_from_Stack()
    {
        Stack1.pop();
    }

    public void run()
    {
      try
       {
        //while(Thread.currentThread().isAlive())
        for(int i=0;i<10;i++)
        {
            if(T1.getName().equals("THREAD1"))
                {
                    System.out.println("Current Thread: "+T1.getName());
                    System.out.println("DOING TASK 1...");

                    Push_Element_to_Stack(i);
                    Thread.sleep(100);
                    System.out.println("Stack1 of Thread1: "+Stack1);
                }
                if(T2.getName().equals("THREAD2"))
                {
                    System.out.println("Current Thread: "+T2.getName());
                    System.out.println("DOING TASK 2...");

                System.out.println("Stack of Thread2 before: "+Stack1);
                    Pop_Element_from_Stack();
                    Thread.sleep(100);
                    System.out.println("Stack of Thread2 after: "+Stack1);
                }
          }

       }
       catch(Exception e)
       {
           System.out.println("Thread interrupted...");
           e.printStackTrace();
       }
    }

    public void start()
    {
        if(T1==null)
        {
            T1=new Thread(this,"THREAD1");
            T1.start();
            try
            {
                T1.join();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
        if(T2==null)
        {
            T2=new Thread(this,"THREAD2");
            T2.start();
            try
            {
                T2.join();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }

    public static void main (String[] args)
    {
        Threading_Sample TASK1=new Threading_Sample();

        TASK1.start();
    }
}
import java.io.*;
导入java.lang.*;
导入java.util.*;
公共类线程化\u示例实现可运行
{
私有线程T1,T2;
字符串ThreadName=“”;
Stack Stack1=新堆栈();
公共void将元素推送到堆栈(int元素)
{
1.推送(元件);
}
public void Pop_元素_from_Stack()
{
Stack1.pop();
}
公开募捐
{
尝试
{
//while(Thread.currentThread().isAlive())

对于(inti=0;i您想要检查当前线程的名称

 Thread.currentThread().getName()
不是T1在
run()中的名称

无论哪个
线程执行它,它总是
true

 Thread.currentThread().getName()