今天刚刚讲到java中的线程,随便也就复习下今天的知识。
在我们学习线程之前所写的类,都是单线程的类,线程是控制线程的简写(thread
of control)。
线程是一个程序中与其他线程无关的能独立运行的代码片段。控制了线程在程序中运行的路径,也就控制了执行的代码。Java
多线程编程其实并不象大多数的书描述的那样简单,所有关于UI(用户界面)的Java编程都要涉及多线程。正如下午刘老提到,在做游戏项目是对线程的处理更为复杂,困难。
想让对象具有多线程的功能,只要继承java.lang.Thread类或者是实现java.lang.Runnable接口。
一个线程是进程中的一个执行流程。一个进程中可以同时包括多个线程。也就是说,一个程序中同时可能进行多个不同的子流程,每个子流程可以得到一小段程序的执行时间,每执行完一个线程就跳到下一个线程。由于转换的速度很快,这使得一个程序可以像是同时处理多个任务。
在java中要实现线程功能,可以继承java.lang.Thread类,并重新定义run()方法,之后实例化自定义的Thread类,接着使用start()方法启动线程。
下面是一个继承Thread类来获得线程的例子:
package com.lovo.test;
public class TwoThread extends Thread {
/**
* @param args
*//覆盖run(),线程从run()开始执行,同时并发执行
public void run()
{
for(int i=0;i<10;i++){
System.out.println("New thread");
}
}
public static void main(String[] args) {
// TODO 自动生成方法存根
TwoThread tt=new TwoThread();
tt.start();//启动线程
for(int i=0;i<10;i++){
System.out.println("Main thread");
}
}
}
由于java
是单继承,假如一个类继承了Thread类,那么就不能继承其他类了,
可以实现java.lang.Runnable接口来定义具有线程功能的类,Runnable接口中定义一个run()方法来实现,在实例化一个Thread对象时,可以传入一个实现Runnable接口的对象作为变量。Thread对象会调用Runnable对象的run()方法,进而执行其中所定义的流程。
下面是一个实现java.lang.Runnable接口来定义具有线程功能的类:
package com.lovo.test;
class MyThread implements Runnable{
int count;
Thread thrd;
MyThread(String name)
{
thrd=new Thread(this,name);
count=0;
thrd.start();
}
public void run()
{
System.out.println(thrd.getName()+"Staring");
try
{
do{
Thread.sleep(1500);
System.out.println("In"+thrd.getName()+",count is"+count);
count++;
}while(count<10);
}
catch(InterruptedException exc)
{
System.out.println(thrd.getName()+"interrupted");
}
System.out.println(thrd.getName()+"terminating ");
}
public static void main(String[] args) {
System.out.println("main thread star");
new MyThread("线程1");
new MyThread("线程2");
new MyThread("线程3");
}
}
线程具有优先权,由1(Thread.MIN_PRIORITY)到10(Thread.MAX_PRIORITY),默认是5(Thread.NORM_PRIORITY)。可以使用Thread的setPriority()方法来设定线程的优先权,设定必须在1到10之间,否则会抛出异常java.lang.IllegalArgumentException。
优先权高的线程会先被执行完毕,然后才会轮到优先权低的线程。如果优先权相同,则轮流执行。假如你用的是双核的电脑,情况又不一样了,由于CPU在处理方式是抢占式,也就是当一个CPU占用的资源较少时,会抢先执行线程。
下面是一个关于线程优先权的例子,放在双核的机器上会有不同的输出:
package com.lovo.test;
public class PriorityDemo implements Runnable{
Thread thrd;
PriorityDemo(String name){
thrd=new Thread(this,name);
}
public void run()
{
System.out.println(thrd.getName()+"已经启动");
System.out.println(thrd.getName()+"已经停下"+"\n");
}
public static void main(String[] args) {
// TODO 自动生成方法存根
PriorityDemo mt1=new PriorityDemo("低优先级的线程");
PriorityDemo mt2=new PriorityDemo("高优先级的线程");
mt1.thrd.setPriority(Thread.NORM_PRIORITY-2);
mt2.thrd.setPriority(Thread.NORM_PRIORITY+2);
mt1.thrd.start();
mt2.thrd.start();
}
}
回顾了下今天所讲的线程内容,也许有地方不是很详细,但后面还要讲到更多关于线程的知识。比如说线程的加入,线程的停止,线程的同步和线程的安全等。
不写了,0点过了 。^_^