线程的创建
方式一:
Thread+重写run方法
public class ThreadTest01 extends Thread{
@Override
public void run (){
for(int i = 0;i<200000;i++){
System.out.println("一边听歌");
}
}
public static void main(String[]args){
ThreadTest01 st = new ThreadTest01();
st.start();//不保证立即运行,有CPU调用。
for(int i = 0;i<200000;i++){
System.out.println("一边coding");
}
}
}
方式二:
/**
* 创建线程方式二:
* 创建:实现Runnable接口+重写run
* 启动:创建子对象+start
* 推荐:避免单继承的局限性;优先使用接口
* 方便共享资源
*/
public class ThreadTest02 implements Runnable{
@Override
public void run (){
for(int i = 0;i<200000;i++){
System.out.println("一边听歌");
}
}
public static void main(String[]args){
//创建实现类对象
ThreadTest02 sr = new ThreadTest02();
//创建代理类对象
Thread t = new Thread(sr);
//启动
t.start();//不保证立即运行,有CPU调用。
for(int i = 0;i<200000;i++){
System.out.println("一边coding");
}
}
}
线程状态
多线程的相关函数
1、获取线程当前状态函数
Thread.State state = t.getState(); //有NEW,RUNNABLE,TERMINATE值
2、线程优先级函数
/**
* 线程优先级1-10
* 默认优先级NORM_PRIORITY;-----5
* 最高优先级MAX_PRIORITY;-----10
* 最低优先级MIN_PRIORITY;-------1
*/
t1.setPriority(Thread.MAX_PRIORITY);
Thread.currentThread().getPriority()//当前线程的优先级
- 注意:优先级高表示调用的概率大,并不代表绝对的先后顺序。要先设置优先级然后开始线程。
3、守护线程函数
/*
守护线程:是为用户线程服务的,jvm不用等待守护线程执行完毕
默认:jvm会等守护线程执行完毕;
*/
god.setDaemon(true);//设置god的线程为守护线程,须为true,默认为false;
god.start();
线程同步机制
由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是synchronized关键字。他包括两种用法:synchronized方法(同步方法)和synchronized块。
方式一:同步代码块
synchronized(同步监视器){
需要被同步的代码
}
- 说明:
1.需要同步的代码不能过多。
2.同步监视器:俗称锁,多个线程必须要共用一把锁。
3.在实现Runnable接口创建多线程的方式中。我们可以考虑使用this充当同步监视器。在继承thread类创建多线程的方式中,慎用this充当同步监视器,考虑使用当前类充当同步监视器。
方式二:同步方法
public synchronized void method (int args){}
- 说明:
该方法一旦执行,该线程就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,方能进入该方法。
若将一个大的方法声明为synchronized将会大大影响效率。