现在的位置: 首页 > 综合 > 正文

java多线程编码,顺序执行(同步)

2013年12月23日 ⁄ 综合 ⁄ 共 1672字 ⁄ 字号 评论关闭

java线程实现机制:

1.继承Thread类,并实现run方法。2.传递Runnable类。

例如:

 

public class TestThread extends Thread
{
  
public void run()//继承Thread后必须实现的方法
 {  
 
 
for(int i = 0; i < 3; i++)

    System.out.println(i);

 }

 
public static void main(String [] args)
 
{
  TestThread[] tt 
= new TestThread[10];  //new 线程数组
  for(int i = 0;i < 10;i++ )
   tt[i] 
= new TestThread(i);   //new  线程
  for(int i = 0;i < 10;i++ )
   tt[i].start();
//线程启动
 }

}


 

创建线程调用的是默认的构造函数.启动线程是使用的start()函数,这个是父类Thread的方法。start()被调用后,回自动的调用run()方法。另一种创建线程的方法:

 

public static void main()

{

Thread thread2 
= new Thread(new Runnable() {
  
public void run() for(int i = 0; i < 5; i++) System.out.println(i); }
     }
);
         thread2.start();//启动
}

有时候我们想让刚才的打印按顺序的输出。如果把刚才的run函数中的for循环10次以上,可能将不会是想要的顺序输出的。要使得线程按顺序输出采用synchronized 关键字。例如下面的函数

 

public class TestThread extends Thread
{
    
int count=0;
    
public TestThread(int id)
    
{
        count 
= id;
    }

    
public void run()
    
{  
    
        print(count);

    }

    
public void main(String [] args)
    
{
        TestThread[] tt 
= new TestThread[10];
        
for(int i = 0;i < 10;i++ )
            tt[i] 
= new TestThread(i);
        
for(int i = 0;i < 10;i++ )
            tt[i].start();
    }

    
public synchronized void print(int i)
    
{
        
for(int q = 0; q < 100; q++)
        
{
            System.out.println(i);
        }

    }

}

这里使用了synchronized关键字。但是打印出来的东西依然不是有序的。这并不是synchronized出现了问题。而是synchronized用于锁定一个对象,或者对象的一个方法。但是对于以上的那个程序。每次new一个TestThread都产生了一个新的对象。而每一个新的对象也有一个print方法。这就没有使synchronized发挥作用。如果这个print方法前加入了static关键字,这个程序便有序输出。

同时也说明java与c++的小小不同。在c++中类的函数并不是归属于类的。也就是说c++的函数有唯一的入口地址。而java则有些不同。不知道是不是每一个非static函数都有对于对象而言的,也不知道是不是每生产一个对象都有一个函数地址。有待研究。。。。。

 

抱歉!评论已关闭.