------- android培训、java培训、期待与您交流! ----------
1 线程的概念
要了解线程,首先的知道进程的概念。
进程: 是一个正在执行的程序,每一个进程都有一个执行的顺序,该顺序是一个执行路径,也可以叫一个控制单元
线程: 就是进程中的一个独立的控制单元,是线程在控制着进程的执行,每一个进程中至少会有一个线程
多线程: 就是在一个进程中开启多条线程。
多线程的运行机制,就是每条线程都可以获取CPU的执行权,程序执行时,CPU在进行着快速的切换,哪个线程得到执行权,哪个线程就执行。同时线程还有一个优先级的概念
2 创建一个线程
在java中,创建一个线程的两种方式,
第一种:
1 创建一个类继承Thread类
2 复写Thread类中的run方法
3 调用线程的start方法,这个方法有两个作用:启动线程 和调用run方法
第二种:
1. 创建一个类实现Runnable接口
2. 复写Runnable接口中的run方法
class MyThread extends Thread{
public void run(){
}
}
3. 通过Thread类建立线程对象
4. 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
5. 调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
Class MyThread2 implements Runnable{
public void run(){
}
}
Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码,这个存储区域就是run方法内,也就是我们要线程执行的代码
继承与实现方式的区别:
因为java是单继承的,所以用实现的方式可以提高程序的扩展性
避免了单继承的局限性。
3. Thread类中的其他方法
1 currentThread 获取当前线程对象
2 getName 获取线程的名字
3 setName 设置线程的名字,也可以在创建线程时定义
4 getPriority 获取线程的优先级编号 1-10 最高优先级为10,最低为1
5 setPriority 设置线程的优先级
public class ThreadDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 设置线程的名字
Thread t = new MyThread("MyThread");
System.out.println(t.getPriority());//获取优先级
t.setPriority(1);//设置优先级
System.out.println(t.getPriority());
t.start();
new Thread(new MyThread2()).start();
}
}
class MyThread extends Thread{
public MyThread(String string) {
super(string);
}
public void run(){
for(int i=0;i<20;i++){// 获取当前线程 获取线程的名字
System.out.println("继承Thread的线程 run "+Thread.currentThread().getName()+" "+i);
}
}
}
class MyThread2 implements Runnable{
@Override
public void run() {
for(int i=0;i<20;i++){
System.out.println("实现Runnable的线程 run "+Thread.currentThread().getName()+" "+i);
}
}
}
4. 线程的安全问题
当存在两个或者两个以上的线程时,如果两个两个线程要操作同一个数据,就会出现安全问题,在java中用Synchronized关键字来解决多线程运行时的安全问题
用Synchronized来解决安全问题class Ticket1 implements Runnable
{
private int tick = 100;
Object obj = new Object();
public void run()
{
while(true)
{
synchronized(obj)//new Object() 这就不是多个线程使用同一个锁
{
if(tick>0)
{
//不能抛 只能try 因为接口中的run方法没有抛出异常
try{Thread.sleep(10);}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"..tick.."+tick--);
}
}
}
}
}
/*
这种方法不常用 继承Thread 类,
*/
class Ticket extends Thread
{
private int tick = 100;
Ticket(String name)
{
super(name);
}
//run方法中存放线程要运行的代码
public void run()
{
while(true)
{
if(tick>0)
{
System.out.println(this.getName()+"..tick.."+tick--);
}
}
}
}
public class ThreadSyn
{
//主线程
public static void main(String[] args)
{
Ticket1 t = new Ticket1();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
}
}