本文主要是我对线程的一些基础了解,可能会有一些有问题,希望不会误导大家;我会在后面继续完善,加上例子说明,改进不足的地方。
1.多线程的定义:对于同一资源,多个任务请求占有时,同时对多项任务进行控制。
2,线程的作用:实现同时执行多任务,如边吃饭边听歌:
(1),普通的类:
public class Demo {
/**
* 听音乐
*/
private static void music(){
for(int i=0;i<1000;i++){
System.out.println("听音乐");
}
}
/**
* 吃饭
*/
private static void eat(){
for(int i=0;i<1000;i++){
System.out.println("吃饭");
}
}
public static void main(String[] args) {
music();
eat();
}
}
只能先听完歌,在吃饭。
(2),线程:
public class Music extends Thread{
public void run() {
for(int i=0;i<1000;i++){
try {
Thread.sleep(100);
System.out.println("听音乐");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class Eat extends Thread{
public void run() {
for(int i=0;i<1000;i++){
try {
Thread.sleep(100);
System.out.println("吃饭");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
/**
* 利用多线程实现一边吃饭一边听歌
*/
Music musicThread=new Music();
Eat eatThread=new Eat();
musicThread.start();
eatThread.start();
}
}
这样能使吃饭和听歌“同时“进行,即边吃饭边听歌。
(3),线程可以实现资源共享:
Thread1 t1=new Thread1("线程资源共享");
Thread t11=new Thread(t1);
Thread t12=new Thread(t1);
Thread t13=new Thread(t1);
Thread t14=new Thread(t1);
...
t11.start();
t12.start();
t13.start();
...
3.线程的状态:
(1),创建状态 在程序中用构造方法创建了一个线程对象后,新的线程对象便处于新建状态,此时,它已经有了相应的 内存空间和其他资源,但还处于不可运行状态。新建一个线程对象可采用 Thread 类的构造方法来实现,例 如, “Threadthread=newThread();” 。
(2),就绪状态 新建线程对象后,调用该线程的 start()方法就可以启动线程。当线程启动时,线程进入就绪状态。此时, 线程将进入线程队列排队,等待 CPU 服务,这表明它已经具备了运行条件。
(3),运行状态 当就绪状态的线程被调用并获得处理器资源时,线程就进入了运行状态。此时,自动调用该线程对象 的 run()方法。run()方法定义了该线程的操作和功能。
(4),堵塞状态 一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入/输出操作时,将让出 CPU 并暂时中止自己的执行,进入堵塞状态。堵塞时,线程不能进入排队队列,只有当引起堵塞的原因被 消除后,线程才可以转入就绪状态。
(5),死亡状态 线程调用 stop()方法时或 run()方法执行结束后,即处于死亡状态。处于死亡状态的线程不具有继续运 行的能力.
4.实现线程的两种方式:
(1),继承Thead()类,线程的启动方法:线程对象的start方法直接启动。
public class Thread1 extends Thread{
public Thread1(...) {
super();
...
}
public void run() {
...
}
public static void main(String[] args) {
Thread1 t1=new Thread1("线程");
t1.start();
}
}
(2),实现Runnable接口,线程的启动方法:并不能直接用新建的线程对象加start方法启动,像如下一样启动,
public class Thread1 implements Runnable{
super();
}
public synchronized void run() {
...
}
public static void main(String[] args) {
Thread1 t=new Thread1("线程");
Thread t1=new Thread(t);
t1.start();
}
}
5:线程的常用方法:
(1),getName(); 返回该线程的名称。
(2),currentThread();返回对当前正在执行的线程对象的引用。
(3),isAlive();测试线程是否处于活动状态。
(4),sleep();线程休眠。
(5),setPriority(intnewPriority);更改线程的优先级。
(6),yield();暂停当前正在执行的线程对象,并执行其他线程
6:线程同步:
(1),在run方法前加synchronized关键字,使run方法同时只能被一个线程调用。
(2),同步块:把run方法的方法体放入同步块中:
public void run(){
synchronized(this){
run方法体
}
}