一、编写多线程分为两种:
1.继承Thread类
2.实现runnable接口
package com.company;
class Mythreadextends Thread{
private Stringname;
public Mythread(String name){
this.name = name;
}
public void run(){
for (int i=0;i<=10;i++){
System.out.println(String.format("线程名:%s\n值为:%s",name,i));
}}}
class Myrunnableimplements Runnable{
private int num=5;
public void run(){
for(int i=0;i<5;i++) {
synchronized (this) {
if (num >0) {
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("the number is :" +num--);
}}}}}
public class ThreadTest {
public static void main(String[] args){
// Mythread t1 = new Mythread("线程1");
// Mythread t2 = new Mythread("线程2");
// t1.start();
// t2.start();
Myrunnable t3 =new Myrunnable();
new Thread(t3).start();
new Thread(t3).start();
}}
二、Runable相对于Thread的好处:
1.Runable适合多个相同代码程序去处理同一资源
2.Thread只能单继承,比较局限
3.增强代码的健壮性,代码可以被多个线程共享,代码和数据是独立的
三、线程休眠
Thread.sleep(1000) //休眠一秒
四、同步和死锁
如果多个线程是实现的Runnable接口,则这个类的属性将被多个线程共享,所以容易出现同步的问题;
解决:1.在run里面加入synchonized(this),这是同步了代码块
2.将run里面的逻辑操作代码分离出来,写成一个方法,在方法面前加synchonized,然后在run里面调用这个方法
死锁:两个线程都掌握着资源,并且都在等待对方释放自己的资源,造成了代码的停滞。