java之Thread(一)

线程的引入

我们学习多线程,首先先学习什么是进程,线程依赖于进程存在

什么是多进程?

进程:系统可以进行独立调配并且是一个不可分割 独立单元

开启一个任务管理器,很多进程(应用软件/某些客户端)
多进程的意义:是为了提高CPU的使用率
现在计算机都是多进程,假设:在听音乐的同时,也在打游戏..,他们是同时进行的吗?
他们不是同时进行的,感觉同时,一点点CPU的时间片在同一个时刻在两个进程之间进行高效的切换!
什么线程?
线程:进程的一个独立的单元
一个进程里面有多个任务,把每一个任务看成一个线程
多线程:
线程之间在抢占CPU的执行权(抢占资源)
多线程的执行具有随机性

举例"
打篮球:1v1 两个人抢占篮球的几率同样大
  1v5   5个人抢占篮球的几率大,并不能说一定抢到 (随机性的)

如何实现多线程程序呢?

 要实现多线程程序,需要开启进程,
 开启进程,是需要创建系统资源,但是Java语言不能创建系统资源
 只有C/C++可以创建系统资源, 利用c语言创建好的系统资源实现
 Java提供了一个类:Thread类
  实现 Thread 类的 run 方法
  1)将类声明为 Thread 的子类
  2)该子类应重写 Thread 类的 run 方法
3)在主线程进行该自定义的线程类的对象的创建
 并行和并发(高并发:MyBatis --->IBatis:半自动化)
 前者逻辑上的同时,指的是同一个时间段内
 后者物理上的同时,指的是同一个时间点
 举例:
public class MyThread extends Thread {
@Override
public void run() {
	for(int i=0;i<200;i++) {
		System.out.println(i);
	}
}
}
public class TheadDemo {
public static void main(String[] args) {
	//创建被执行的类对象
	MyThread m=new MyThread();
	m.start();
	MyThread n=new MyThread();
	n.start();
}
}

注释:不能直接调用run方法,必须使用start方法,使用时,不能用一个对象使用多个,多个对象可以同时分别调用来使用。

Thread 类提供了一些方法
  public final void setName(String name):给线程起名称
  public final String getName() :获取线程名称

举例:
public class ThreadDemo {
public static void main(String[] args) {
	//创建两个线程
	MyThread m1=new MyThread();
	MyThread m2=new MyThread();
	//启动
	m1.start();
	m2.start();
//	MyThread m3=new MyThread();
//	MyThread m4=new MyThread();
//	m3.setName("星星");
//	m4.setName("月亮");
//	m3.start();
//	m4.start();
//	MyThread m5=new MyThread("星星");
//	MyThread m6=new MyThread("月亮");
//	m5.start();
//	m6.start();
	System.out.println(Thread.currentThread().getName());
}
}

public final void jion():等待该线程终止之后才进行线程枪战

分别创建三个子线程,让第一个子线程执行之后,调用join()等待该线程中,在执行t2,t3线程

举例:

public class ThreadJoinDemo {
    public static void main(String[] args) {
		ThreadJoin t1=new ThreadJoin();
		ThreadJoin t2=new ThreadJoin();
		ThreadJoin t3=new ThreadJoin();
		t1.setName("曾轶可");
		t2.setName("毛不易");
		t3.setName("李荣浩");
		t1.start();
		try {
			t1.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		t2.start();
		t3.start();
	}
}

线程常用的方法

public static void yield()暂停当前正在执行的线程对象,并执行其他线程,有利于同时进行

public final void setDaemon(boolean on) :true时,表示为守护线程
  将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。(守护线程不会立即结束掉,它会执行一段时间在结束掉)

  该方法必须在启动线程前调用。

跟线程优先级相关的方法:
  public final int getPriority()返回线程的优先级。 
  public final void setPriority(int newPriority)更改线程的优先级
  线程存在一个默认优先级
   public static final int MAX_PRIORITY 10 最大优先级
   public static final int MIN_PRIORITY 1 最小优先级

   public static final int NORM_PRIORITY 5 默认优先级

举例:

public class ThreadDemo {
public static void main(String[] args) {
	MyThread t1=new MyThread();
	MyThread t2=new MyThread();
	MyThread t3=new MyThread();
	t1.setName("Yield");
	t2.setName("join");
	t3.setName("Deamon");
	t1.setPriority(5);
	t2.setPriority(1);
	t3.setPriority(10);
	t1.start();
	t2.start();
	t3.start();
}
}
public static void sleep(long millis):线程睡眠 指定是时间毫秒值

  throws InterruptedException 

两个区别?

public final void stop() ;强迫线程停止执行。 不会执行了 (过时了),方法能使用的
public void interrupt()中断线程。 表示中断线程的一种状态 
面试题
wait()和sleep()的区别?
wait(): wait()调用的,立即释放锁  (同步锁/Lock锁)

sleep(): 线程睡眠,调用不会释放锁

举例:

public class ThreadStopDemo {
public static void main(String[] args) {
	ThreadStop s1=new ThreadStop();
	s1.start();
	try {
		s1.sleep(3000);
		s1.interrupt();
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		System.out.println("程序出现了异常");
	}
}
}
实现多线程程序的第二种方式:
  1)自定义一个类,实现Runnable接口
  2)实现接口中的run方法,对耗时的代码进行操作
  3)然后在主线程中创建该了对象,将该类对象做为一个资源类,创建Threadd类的对象,将刚才的资源类作为参数进行传递 
 举例:
public class MyThread {
public static void main(String[] args) {
	ThreadDemo m=new ThreadDemo();
	Thread t1=new Thread(m,"Deamon");
	Thread t2=new Thread(m,"sleep");
	t1.start();
	t2.start();
}
}

注释:执行线程的方法有两种:一种是继承Thread,来重写run方法,第二种是实现runnable接口,来重写run方法。

猜你喜欢

转载自blog.csdn.net/wt5264/article/details/80601361