/*
* 进程:
* 定义:运行中的程序称为进程,进程负责内存空间的分配;
*
* 说明:单核cpu在一致时间翩只能运行一个程序。所有运行的程序实际上是在争夺CPU的使用权,cpu在短时间内快速切换来执行不同的程序;
* 这就是多任务运行实现机制;
*
* 线程:
* 定义:线程负责代码的执行
* 运行任何一个java程序的时候,jvm都会创建一个main线程,并执行main中的代码
* 一个java应用程序至少有2个线程,一个是main线程,负责执行代码,一个是垃圾回收器线程负责回收垃圾
*
*多线程的好处:
* 1. 一个进程同时执行多个任务;
* 2. 提高了资源的利用率;
*
*多线程的弊端
* 1. 增加了cpu的负担;
* 2. 降低了一个进程中线程的执行概率:
* 2. 出现了死锁的问题;
*
*创建多线程
* 方式一:
* 1. 定义一个子类去继承Thread类;
* 2. 重写Thread的run方法:
* 说明:jvm创建的主线程所运行的代码就是main方法中的代码,而自定义的线程所要执行的代码是放在run方法中的,重写的目的是把自定义线程所要运行的代码放入到run方法中.
* 3. 创建THread的子类对象,调用Start()方法开启线程;
* 说明:一旦开启了线程,jvm就会自动执行run方法中的代码,而不能手动调用run方法,否则就会像调用普通方法一样而不会开启新进场;
* 方式二:
** 线程创建方式二:
* 1, 自定义一个类实现Runnable接口;
* 2. 实现Runnable的run方法, 把自定义线程代码放在run方法中;
* 3. 创建Runnable实现类的对象;
* 4. 创建Thread类的对象;将Runnable实现类的对象传递给Thread类的构造函数;
* 5. 调用Thread类对象的start方法;
*
* 注意的问题:
* 1. Runnable的实现类对象并不是线程对象,而是Runnable的实现类而已。只有Thread和Thread的子类对象才是线程duix
* 2. 将Runnable的实现类对象作为参赛传递给Thread的作用是将其run方法中代码传递给Thread对象,底层是Thread中
* 的run方法调用了传递过来的Runnable实现类对象中的run方法.
*线程的生命周期
/*
* 线程类常用方法
* Thread(String anem) 初始化线程的方法
*
* getName() 返回线程的方法
* sleep() 指定线程的睡眠时间,毫秒为单位,sleep是静态方法,那个静态方法执行了该方法,那么就是那个线程睡眠;
* getPriority() 返回当前线程的优先级, 默认线程的优先级是5
* setPriority(int newPriority) 设置线程的优先级,虽然设置了线程的优先级,但是具体取决于底层的操作系统的实现(最大的优先级是10,最小的是1,默认为5);
* currentThread() 返回cpu正在执行的线程数;静态方法,那么线程执行了该方法就返回当前线程对象
*线程安全问题:
* 1. 出现原因: 有多个线程共享数据
* 2. 有多个语句操作共享数据;
* 线程同步机制:
* 方式一: 同步代码块
* 使用格式:
* synchronized(锁对象)
* { 同步代码;...}
* 注意:
* 1. 锁对象可以是任意的对象,只要是对象都可以;
* 原理是任何对象内部都隐式维护了一个状态变量(非静态成员变量),而同步机制就利用这了这个状态来实现锁机制;
* 2. 在同步代码块中调用了sleep()方法,那么在线程休眠的时候不会释放锁;
* 3. 只有真正出现线程安全问题,才使用同步代码块来解决;
* 4. 同步代码块中使用的锁必须是唯一的,不能使用匿名对象;因此要使用静态对象;
* 最简单的方式是使用一个字符串常量,因为字符串存在于字符串常量池中,是共享的.
*
* 方式二:同步函数
* 使用synchronized修饰一个函数
* 格式:
* synchronized 函数名(){}
* 注意:
* 1. 如果synchronized修饰非静态成员函数,那么线程锁是this对象,如果是静态成员函数,那么线程锁是函数所在类的字节码文件;
* 2. 同步函数的锁对象是固定的,不能修饰;
*
* 说明:推荐使用同步代码块
* 1. 同步代码块的锁对象可以随意指定,方便控制,同步函数的锁是固定的,不能指定:
* 2. 同步代码块可以方便需要同步代码的范围,同步函数必须是函数中的整个代码:
*/
public class Demo17 extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
for(int i=0; i<10000; i++)
{
System.out.println("我是自定义线程" + i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建自定义线程对象
Demo17 d17 = new Demo17();
d17.start();
for(int i=0; i<10000; i++)
{
System.out.println("我是主线程" + i);
}
}
}
线程创建方式二:
public class Demo5 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0; i<100; i++)
{
System.out.println(Thread.currentThread().getName()+"自定义线程"+i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo5 d3 = new Demo5();
Thread td = new Thread(d3, "张三儿");
td.start();
for(int i=0; i<100; i++)
{
System.out.println("Main方法的线程"+i );
}
}
}