java线程的简单实现及方法

java线程:

线程是一个程序内部的顺序控制流。

cpu实际上在一个时间点上,只执行一个。只不过我们把cpu分成了多个时间片,由于速度很快,我们看起来像是多个线程。。

就像你的时间分成几片,这样 整体看来做事情有规律,效率就会高,何况是cpu呢。

线程的创建和启动:


 

方法一:

java线程通过java.lang.Thread类来实现。

VM启动时会有一个主方法所定义的线程,

每一个线程是Tread对象通过它的run()方法来完成操作。

启动线程方式:Thread的start()方法。


 

如下代码: 

public class  TestThread
 
{
 
public static void main(String[] args)
 
{
 
Runner1 r = new Runner1();
 
//定义线程对象。并且调用线程的构造方法。
 
Thread t = new Thread(r);
 
//启动线程。
 
t.start();
 
for(int i=0;i<100;i++)
 
{
 
System.out.println("Main thread-----" + i);
 
}
 
}
 
}
 
class Runner1 implements Runnable
 
{
 
public void run()
 
{
 
for (int i=1;i<100;i++)
 
{
 
System.out.println("Runner1" + i);
 
}
 
}
 
}
注意:
 重写(override)run()方法在该线程的start()方法被调用后,JVM会自动调用run方法来执行任务;但是重载    (overload)run()方法,该方法和普通的成员方法一样,并不会因调用该线程的start()方法而被JVM自动运行。
 

方法二:

定义一个Thread类的子类,重写run()方法,然后生成这个类的对象,在启动进程。

如下代码:

public class  TestThread
 
{
 
public static void main(String[] args)
 
{
 
Runner1 r = new Runner1();
 
//启动线程。
 
r.start();
 
for(int i=0;i<100;i++)
 
{
 
System.out.println("Main thread-----" + i);
 
}
 
}
 
}
 
class Runner1 extends Thread
 
{
 
public void run()
 
{
for (int i=1;i<100;i++)
 
{
System.out.println("Runner1" + i); 
}
}
}

以下是线程的方法及属性:
线程的方法(Method)、属性(Property)
1)优先级(priority)
每个类都有自己的优先级,一般property用1-10的整数表示,默认优先级是5,优先级最高是10;优先级高的线程并不一定比优先级低的线程执行的机会高,只是执行的机率高;默认一个线程的优先级和创建他的线程优先级相同;
 
2)Thread.sleep()/sleep(long millis)
当前线程睡眠/millis的时间(millis指定睡眠时间是其最小的不执行时间,因为sleep(millis)休眠到达后,无法保证会被JVM立即调度);sleep()是一个静态方法(static method) ,所以他不会停止其他的线程也处于休眠状态;线程sleep()时不会失去拥有的对象锁。作用:保持对象锁,让出CPU,调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留一定的时间给其他线程执行的机会;
 
3)Thread.yield()
让出CPU的使用权,给其他线程执行机会、让同等优先权的线程运行(但并不保证当前线程会被JVM再次调度、使该线程重新进入Running状态),如果没有同等优先权的线程,那么yield()方法将不会起作用。
 
4)thread.join()
使用该方法的线程会在此之间执行完毕后再往下继续执行。
 
5)object.wait()
当一个线程执行到wait()方法时,他就进入到一个和该对象相关的等待池(Waiting Pool)中,同时失去了对象的机锁—暂时的,wait后还要返还对象锁。当前线程必须拥有当前对象的锁,如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,所以wait()必须在synchronized block中调用。
 
6)object.notify()/notifyAll()
唤醒在当前对象等待池中等待的第一个线程/所有线程。notify()/notifyAll()也必须拥有相同对象锁,否则也会抛出IllegalMonitorStateException异常。
 
7)Synchronizing Block
Synchronized Block/方法控制对类成员变量的访问;Java中的每一个对象都有唯一的一个内置的锁,每个Synchronized Block/方法只有持有调用该方法被锁定对象的锁才可以访问,否则所属线程阻塞;机锁具有独占性、一旦被一个Thread持有,其他的Thread就不能再拥有(不能访问其他同步方法),方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。

 

posted @ 2016-08-13 12:06  Beyondづ  阅读(182)  评论(0编辑  收藏  举报