线程的五种状态以及之间的关系
1.简单的多线程例子
package Demo;
public class ThreadTest extends Thread{
public void run(){
for (int i = 0; i < 100; i++) {
System.out.println("Thread run :"+i);
}
}
public static void main(String[] args) {
ThreadTest t =new ThreadTest();
t.start();//开启线程,并执行该线程的run方法
//t.run();//仅仅是对象调用方法,而线程创建了,并没有运行
for (int i = 0; i < 100; i++) {
System.out.println("Main method:"+i);
}
}
}
2.创建两个线程,和主线程交替运行(继承Thread)
package Demo;
public class ThreadTest02 extends Thread{
private String name;
ThreadTest02(String name){
this.name=name;
}
public void run(){
for (int i = 0; i < 50; i++) {
System.out.println(name + " run :"+i);
}
}
public static void main(String[] args) {
ThreadTest02 t1=new ThreadTest02("one");
ThreadTest02 t2=new ThreadTest02("two");
t1.start();
t2.start();
for (int i = 0; i < 50; i++) {
System.out.println("Main method:"+i);
}
}
}
3.创建两个线程,和主线程交替运行(实现Runnable),此例子共享被多线程操作的对象
package TicketDemo;
public class Ticket implements Runnable{
private int tick = 100;
public void run() {
while (tick > 0) {
System.out.println(Thread.currentThread().getName()
+ " sale:" + tick--);
}
}
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 =new Thread(t);
Thread t2 =new Thread(t);
t1.start();
t2.start();
}
}
4.同步代码块(同步锁)
synchronized(对象){
需要同步的代码块
}
对象如同锁。持有锁的线程可以在同步中执行。
没有持有锁的线程即使有执行权,也进不去,因为没有锁。
同步的前提:
1.必须要有两个或者两个以上的线程。
2.必须是多个线程使用同一个锁。
必须保证同步中只能有一个线程在运行。
优点:解决了多线程的安全问题。
缺点:多个线程都需要判断锁,较为消耗资源。