线程:用来同时执行多个任务使用。 线程的运行是并发的。
创建线程的3种方式:
第1种创建线程的方式:定义一个类,并继承Thread,重写run方法。run方法中就可以定义当前线程要执行的任务了。然后调用该线程的start()方法就启动的该线程。
例1:
一个类中可以有多个类。但是public修饰的类只有一个。
package day04;
/**
* 线程:用来同时执行多个任务使用。 线程的运行是并发的。
* 创建线程有两种方式。
*/
public class ThreadDemo1 {
public static void main(String[] args) {
Thread t1 = new MyThread1();
Thread t2 = new MyThread2();
/*
* 启动线程不要去直接调用线程的run方法,因为该方法是线程要执行的任务。而我们要调用的是start方法。该方法的作用是将 当前线程纳入到线程调度中,使其具有可以并发执行的能力。
* start方法调用完毕后,线程处于runnable状态。只要它被分配了CPU的时间片,就会开始运行,这时它会自动调用run方法。
*/
t1.start();
t2.start();
}
}
/**
* 第一种创建线程的方式:定义一个类,并继承Thread,重写run方法。 run方法中就可以定义当前线程要执行的任务了。
* @author Administrator
*/
class MyThread1 extends Thread{
public void run(){
for(int i=0;i<1000;i++){
System.out.println("你是谁啊?");
}
}
}
class MyThread2 extends Thread{
public void run(){
for(int i=0;i<1000;i++){
System.out.println("我是查水表的!");
}
}
}
第2种创建线程的方式:自定义一个类实现Runnable接口,重写run方法,并定义线程要执行的任务。创建线程的同时指派任务并启动线程开始工作。
package day04;
/**
* 第二种创建线程的方式实现Runnable接口,并定义线程要执行的任务。创建线程的同时指派任务并启动线程开始工作。
*
* 第一种创建线程的方式的不足:
* 1:线程内部的run方法定义了线程要执行的任务。这就导致了线程与线程的任务有一个强耦合关系。不利于线程的重用。
* 2:由于java是单继承的,这就导致我们若需要继承某个父类,同时又需要并发运行,就导致我们无法同时继承两个类。
*/
public class ThreadDemo2 {
public static void main(String[] args) {
/* 创建线程要执行的任务
*/
Runnable r1 = new MyRunnable1();
Runnable r2 = new MyRunnable2();
/* 创建线程,同时指派任务
*/
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
/**
* 定义该类并实现Runnbale接口,用来指定线程要完成的任务
* @author Administrator
*/
class MyRunnable1 implements Runnable{
public void run() {
for(int i=0;i<1000;i++){
System.out.println("你是谁啊?");
}
}
}
class MyRunnable2 implements Runnable{
public void run() {
for(int i=0;i<1000;i++){
System.out.println("我是查水表的!");
}
}
}
第3种创建线程的方式,使用匿名内部类方式:
package day04;
/**
* 使用匿名内部类的形式创建线程
*/
public class ThreadDemo3 {
public static void main(String[] args) {
/*
* 第一种创建线程的形式
*/
Thread t1 = new Thread(){
public void run(){
for(int i=0;i<1000;i++){System.out.println("你是谁啊?");}
}
};
/*
* 第二种创建线程的方式
*/
Runnable runn = new Runnable(){
public void run(){
for(int i=0;i<1000;i++){System.out.println("我是查水表的!");}
}
};
Thread t2 = new Thread(runn);
t1.start();
t2.start();
}
}
例4:使用Runnable创建线程的方式实现JFrame对话框背景颜色切换实例:
package day04;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 测试Runnable
* @author Administrator
*
*/
public class TestRunnable extends JFrame implements Runnable{
@Override
public void run() {
int i=0 ;
JPanel panel=new JPanel();
panel.setSize(300, 300);
this.setContentPane(panel);
while(true){
i= i==0?1:0;
if(i==0){
panel.setBackground(Color.BLACK);
}else{
panel.setBackground(Color.WHITE);
}
}
}
public static void main(String[] args) {
TestRunnable r=new TestRunnable();
r.setSize(300,300);
r.setVisible(true);
r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Thread t=new Thread(r);
t.start();
}
}
运行效果:
