1.throws和throw的区别

throws使用在函数外,是编译时的异常,throw使用在函数内,是运行时的异常

使用方法

public int method(int[] arr) throws NullPointerException{}

public int method(int[] arr){

if(arr==null){

throw new NullPointerException (“数组的引用不能为空”);

}

}

throws 抛出的是异常类,可以抛出多个,用逗号隔开,throw抛出的是异常对象

2.Java中的四种权限

public protected default private,其中如果什么都没有写,就是default

3.多线程

多线程的好处:解决了多个程序同时运行的问题。

多线程的弊端:线程太多会导致效率降低

其实应用程序的执行都是CPU在做着快速的切换完成的。这个切换是随机的

java中运行垃圾回收是:System.gc();

创建线程方式一并使用

代码如下:

package com.itcast.test;

/**
* 创建线程方式
* 1.子类继承Thread类,子类覆盖父类中的run方法,将线程要执行的代码写在run方法中
* 2.建立子类对象的同时线程也被创建
* 3.通过调用start方法开启线程
* @author yxl
*
*/
public class ThreadSub extends Thread {
@Override
public void run() {
// 这里面是线程要执行的代码
for (int i = ; i < ; i++) {
System.out.println(i+"---"+Thread.currentThread().getName());
}
}
public ThreadSub(String threadName){
}
}
package com.itcast.test;
public class Demo { public static void main(String[] args) {
//创建线程并调用第一种方式
ThreadSub threadSub = new ThreadSub("线程1");
ThreadSub threadSub2 = new ThreadSub("线程2");
threadSub.start();// 开启线程,调用run方法
// threadSub.run();如果直接调用run()方法就是只调用主线程执行
threadSub2.start(); } }

创建线程方式二推荐使用这种方式

代码如下:

package com.itcast.test;
/**
* 创建线程的第二种方式,实现Runnable接口。推荐使用这种方式
* 1.定义类实现Runnable接口
* 2.覆盖接口中的run方法,并将线程的任务代码封装到run方法中
* 3.通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数
* 的参数进行传递,通过对象调用run方法
* 4.调用线程对象的start()开启线程
* @author yxl
*
*/
public class ImplementThread implements Runnable { @Override
public void run() {
// 这里面是线程要执行的代码
for (int i = ; i < ; i++) {
System.out.println(i+"---"+Thread.currentThread().getName());
} } }
package com.itcast.test;
public class Demo { public static void main(String[] args) {
//创建线程并调用第二种方式,推荐使用第二种方式
ImplementThread thread = new ImplementThread();
Thread t =new Thread(thread);
t.start();
Thread t2 =new Thread(thread);
t2.start(); } }

同步解决线程安全问题(JDK1.5之前版本使用的方式)

Object object = new Object();

synchronized (object) {

}

相当于lock锁

/**

* 同步函数

* 同步函数使用的锁是this,建议使用同步代码块锁

*/

public synchronized void Show() {

}

线程间通讯:

多个线程在处理同一资源,但是任务却不同。

生产者消费者模式:

代码如下:

package com.itcast.test1;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /*
* 等待唤醒机制
* 1.wait():让线程处于冻结状态,被wait的线程会被存储到线程池中
* 2.notify():唤醒线程池中一个线程(任意)
* 3.notifyAll():唤醒线程池中的所有线程。
* 这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法,必须要明确到底操作的是哪个锁上的线程。
* 以上方法都是定义在Object类中,因为这些方法是监视器的方法,监视器其实就是锁
* jdk1.5以后将同步和锁封装成了对象,并将操作锁的隐士动作变成了显示动作 。
* Lock接口:出现替代了同步代码块或者同步函数。将同步的隐士锁操作变成现实锁操作,同时更为灵活,可以一个锁上加上多组监视器
* lock():获取锁,unlock():释放锁,通常需要定义在finally代码块中。
* Condition接口:出现替代了Object中的wait notify notifyAll方法,将这些监视器方法单独进行了封装,
* 变成Condition监视器对象。可以任意锁进行组合。
* await()
* signal()
* signalAll()
*/
/**
* 生产资源类
* @author yxl
*
*/
public class Resourse {
private String name;
public boolean flag = false;// 用来标识用的,为了实现生产一个,消费一个,为true,表示生产者有数据
Lock lock = new ReentrantLock();
Condition conditionProductor = lock.newCondition();
Condition conditionCustomer = lock.newCondition();
int count = ;
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void set(String name) {
lock.lock();
try {
while (flag) {
conditionProductor.await();
}
setName(name+count);
count++;
System.out.println(Thread.currentThread().getName()+"-----"+getName());
flag = true;
conditionCustomer.signal();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
} public void out(){
lock.lock();
try {
while (!flag) {
conditionCustomer.await();
}
System.out.println(Thread.currentThread().getName()+"-----"+name);
flag = false;
conditionProductor.signal();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
package com.itcast.test1;
/**
* 生产者类
* @author yxl
*
*/
public class Productor implements Runnable {
Resourse resourse ;
public Productor(Resourse resourse){
this.resourse = resourse;
}
@Override
public void run() {
while(true){
resourse.set("生产者名称");
}
}
}
package com.itcast.test1;
/**
* 消费者类
* @author yxl
*
*/
public class Customer implements Runnable {
Resourse resourse ;
public Customer(Resourse resourse){
this.resourse = resourse;
}
@Override
public void run() {
while(true){
resourse.out();
}
}
}
package com.itcast.test1;

public class MainDemo {

    public static void main(String[] args) {
Resourse resourse = new Resourse();
Productor productor = new Productor(resourse);
Customer customer = new Customer(resourse);
Thread thread1 = new Thread(productor);
thread1.start();
Thread thread2 = new Thread(customer);
thread2.start();
Thread thread3 = new Thread(productor);
thread3.start();
Thread thread4 = new Thread(customer);
thread4.start();
} }

wait和sleep的区别:

1.wait可以指定时间也可以不指定,sleep必须指定时间

2.在同步中,对CPU的执行权和锁的处理方式不同

wait释放执行权,释放锁,sleep释放执行权,不释放锁,因为它一定有时间的限制,不需要释放锁。

终止线程的方法:

1.可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具备CUP的执行资格。当然强制动作会发生InterruptedException,记得要处理,在异常处理中使用标记来终止线程

2.也可以使用thread2.setDaemon(true);将线程设置为守护线程,也就是后台线程,所有前台线程都结束,后台线程自动结束

代码如下:

package com.itcast.test2;

public class StopThread implements Runnable {
private boolean flag = true;
@Override
public synchronized void run() {
while(flag){
try {
wait();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName());
//出错的时候,可以设置标记
flag = false; }
System.out.println(Thread.currentThread().getName());
}
}
}
package com.itcast.test2;

public class MainDemo {

    public static void main(String[] args) {
StopThread stopThread = new StopThread();
Thread thread = new Thread(stopThread);
thread.start();
thread.setPriority(Thread.MAX_PRIORITY);//设置线程的优先级,值为1-10
Thread thread1 = new Thread(stopThread);
thread1.start();
Thread thread2 = new Thread(stopThread);
thread2.setDaemon(true);//第二种终止线程的方法,将线程设置为守护线程,也就是后台线程
//所有前台线程都结束,后台线程自动结束
thread2.start();
for (int i = ; i < ; i++) {
if (i==) {
thread.interrupt();//调用interrupt()方法终止线程
thread1.interrupt();
}
System.out.println(i);
}
}
}

JAVA基础学习之throws和throw的区别、Java中的四种权限、多线程的使用等(2)的更多相关文章

  1. Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  2. Java基础学习总结(71)——深入理解Java虚拟机内存

    Java虚拟机中的内存分配图 : 各个区域的特性总结如下表: 补充说明: 当多线程情形下,可能多个线程要在堆上分配内存,那么可能出现内存分配的同步问题,解决方案有两个,一个就是同步内存分配动作:另一个 ...

  3. Java中的四种权限修饰符及六种非访问修饰符(简识)

    一.是哪四种访问权限修饰符呢? public > protected > [default] > private (公共的 ) (受保护的) (默认的) (私有的) 二.简单认识四种 ...

  4. Java基础学习总结(59)——30 个java编程技巧

    1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 "if else" 判断null ...

  5. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  6. Java基础学习总结(87)——坚持写Java等技术类博客的好处

    1.加深对技术点的理解 每天写博客,可以加深对技术点的理解,假如工作中,对某个技术点运用的不熟,当你通过博客的形式写出来,这个过程中,遇到不懂的知识点,你就会查阅相关的资料,弄明白他. 2.自己日后用 ...

  7. Java 中的四种权限修饰符

    * * private: * Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”. * 被其修饰的属性以及方法只能被该类的对象 访问,其子类不能访问,更不能允许跨包访问. * * def ...

  8. java中的四种权限

    1.私有权限(private) private可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类).被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用. ...

  9. Java中的四种权限修饰符

    权限修饰符   public protected [default] private 同一个类 YES YES YES YES 同一个包 YES YES YES NO 不同包子类 YES YES NO ...

随机推荐

  1. spring mvc实现新增用户

    spring mvc实现新增用户 1.先在展示页面(查询出来的结果页)添加一个连接<a href="add">添加</a> 2.在后台添加一个添加的方法,点 ...

  2. IE input file隐藏不能上传文件解决方法

    当大神们都在探讨更深层次的问题时,我还在这里转载发些肤浅的问题解决方案.罢了,为了和我一样笨的后来人. 问题: 上传文件时,用<input type="file" /> ...

  3. SQLite常见警告

    引言 在vs2012中使用sqlite时,总会出现一个警告,lz是完美型的人,看到一个警告,心里多少看着不舒服啊. 解决办法 警告内容: 所生成项目的处理器架构“MSIL”与引用“System.Dat ...

  4. GDB中应该知道的几个调试方法 来自陈皓

    GDB中应该知道的几个调试方法 2011年2月10日陈皓发表评论阅读评论62,325 人阅读   七.八年前写过一篇<用GDB调试程序>,于是,从那以后,很多朋友在MSN上以及给我发邮件询 ...

  5. Antenna Placement(匈牙利算法 ,最少路径覆盖)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6991   Accepted: 3466 ...

  6. 习惯mac . OS X 安装MacPorts

    1. 安装必要的软件 安装MacPorts需要先安装X11和Xcode,Lion系统已经默认安装好了X11,在Appstore里安装Xcode即可. 下载完Xcode之后,一般路径在/Applicat ...

  7. LoadRunner中响应时间与事物时间详解

    1. 响应时间 事务是指用户在客户端做一种或多种业务所需要的操作集,通过事务函数可以标记完成该业务所需要的操作内容:另一方面事务可以用来统计用户操作的响应时间,事务响应时间是通过记录用户请求的开始时间 ...

  8. Linux下更好用的帮助命令—cheat

    导读 Linux系统中,我们经常会用man命令来帮助查看这个命令的具体用法,man是很强大的,但是英语不好的同学用man用起来可能不那么顺手,自然而然的就出现了cheat命令,cheat命令就是通过简 ...

  9. iphone数据存储之-- Core Data的使用(一)

    http://www.cnblogs.com/xiaodao/archive/2012/10/08/2715477.html 一.概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终 ...

  10. Vmware虚拟机

    1.在虚拟机安装完系统后找到相对应的保存路径如:D:\VMware\VOS\Win7x64OS 2.该目录下面会有很多文件和文件夹,其中配置文件Windows 7 x64.vmx和硬盘文件Window ...