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();//线程启动
}
}
... {
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); }
});
... {
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);
}
}
}
... {
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函数都有对于对象而言的,也不知道是不是每生产一个对象都有一个函数地址。有待研究。。。。。