
1.继承Thread
* 定义类继承Thread
* 重写run方法
* 把新线程要作的事写在run方法中
* 建立线程对象
* 开启新线程, 内部会自动执行run方法
public class Demo2_Thread {
public static void main(String[] args) {
MyThread mt = new MyThread(); //4,建立自定义类的对象
mt.start(); //5,开启线程
for(int i = 0; i < 3000; i++) {
System.out.println("bb");
}
}
}
class MyThread extends Thread { //1,定义类继承Thread
public void run() { //2,重写run方法
for(int i = 0; i < 3000; i++) { //3,将要执行的代码,写在run方法中
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
}html
* 2.实现Runnable
* 定义类实现Runnable接口
* 实现run方法
* 把新线程要作的事写在run方法中
* 建立自定义的Runnable的子类对象
* 建立Thread对象, 传入Runnable
* 调用start()开启新线程, 内部会自动调用Runnable的run()方法ide
public class Demo3_Runnable {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable(); //4,建立自定义类对象
//Runnable target = new MyRunnable();
Thread t = new Thread(mr); //5,将其看成参数传递给Thread的构造函数
t.start(); //6,开启线程
for(int i = 0; i < 3000; i++) {
System.out.println("bb");
}
}
}
class MyRunnable implements Runnable { //1,自定义类实现Runnable接口
@Override
public void run() { //2,重写run方法
for(int i = 0; i < 3000; i++) { //3,将要执行的代码,写在run方法中
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
}函数

匿名内部类:post




在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) this
用个比较通俗的好比,任何一个守护线程都是整个JVM中全部非守护线程的保姆:url
只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就所有工做;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工做。spa
Daemon的做用是为其余线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。.net
User和Daemon二者几乎没有区别,惟一的不一样之处就在于虚拟机的离开:若是 User Thread已经所有退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 由于没有了被守护者,Daemon也就没有工做可作了,也就没有继续运行程序的必要了。线程

thread.Join把指定的线程加入到当前线程,能够将两个交替执行的线程合并为顺序执行的线程。3d
好比在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
t.join(); //调用join方法,等待线程t执行完毕
t.join(1000); //等待 t 线程,等待时间是1000毫秒。
Thread.yield()方法的做用:暂停当前正在执行的线程,并执行其余线程。(可能没有效果)
yield()让当前正在运行的线程回到可运行状态,以容许具备相同优先级的其余线程得到运行的机会。所以,使用yield()的目的是让具备相同优先级的线程之间可以适当的轮换执行。可是,实际中没法保证yield()达到让步的目的,由于,让步的线程可能被线程调度程序
再次选中。
结论:大多数状况下,yield()将致使线程从运行状态转到可运行状态,但有可能没有效果。




锁对象要惟一的, this表明实例这个对象,每一个线程都会实例对象,致使不是惟一。 类.class 惟一